2017-07-19 56 views
0

我想創建模式,其中body可以根據進入的事件有它不同的密鑰。所以當我嘗試呈現數據時,只需將_id發送給客戶端event不是結果的一部分。我用這種方法實施了錯誤的模式嗎?如何在有動態值時使用貓鼬模式?

event.model.js

var mongoose = require('bluebird').promisifyAll(require('mongoose')); 


var bmpEventSchema = new mongoose.Schema({ 
    event: { 
    type: String, 
    body : {} 
    } 
}); 

export default mongoose.model('BmpEvent', bmpEventSchema); 

JsonDocument

{ 
    "_id" : ObjectId("596f672f4c387baa25db5ec6"), 
    "event" : { 
     "type" : "json", 
     "body" : { 
      "evntType" : "Smtduki", 
      "tkt" : "75522655", 
      "cat" : "RNT", 
      "esc_lvl" : "4", 
      "asset" : "DNEC843027 ATI", 
      "esc_tm" : "2017-05-26 09:18:00", 
      "tos" : "T3APLS", 
      "mcn" : "SL6516", 
      "cusTkt" : "", 
      "tktSrc" : "BMP", 
      "tier1" : "STLMOETS" 
     } 
    } 
} 
+0

這真的不是我清楚你問這裏。 –

+0

不需要提供貓鼬方法。 – Lazyexpert

回答

0

模式是錯誤的。應該是:

var bmpEventSchema = new mongoose.Schema({ 
    event: { 
    type: String, 
    body : Mixed 
    } 
}); 
+0

參考錯誤:未在對象處定義混合 。 開發/ bpm_modeler /服務器/ API/bmpEvents/bmpEvent.model.js:9:12) – hussain

+0

然後'Schema.Types.Mixed' –

+0

沒有運氣'體:Schema.Types.Mixed 的ReferenceError:架構不defined' – hussain

0

有兩種方法我可以建議:

  • 你根本就沒有列出你的鑰匙在你的榜樣
  • 你列出所有可能的密鑰,並標記它們中的一些作爲(根據你的邏輯)所需

實施例:

"key": { 
    type: "string", 
    required: true 
} 
0

這是一個用例discrimnators。你可以使身體成爲混合類型,但是這會破壞貓鼬的目的以提供驗證。假設你正在模擬書籍的數據庫。你爲一本教科書製作了一個名爲教授的鑰匙。但是,那麼你需要爲小說做一個關鍵的小說家。你需要存儲流派的小說而不是教育書籍。 現在你可以像你在用例中那樣製作一個類型鍵,並與結果一起玩。但是,你可能不得不在小說中爲小說家應用默認值。或者您可能需要設置其中一種類型而不是另一種類型所需的字段。這種方法的另一個問題是使用中間件(掛鉤)到不同的類型。你可能想要創建一個不同的功能來創建教科書的新穎和不同的功能。這只是一個場景,你可以有10或15種類型,這將更加麻煩。 現在爲了避免這些問題,您可以爲每種類型製作不同的模型。但是如果你這樣做,當你想查詢所有書籍時,你將不得不對每個模型進行查詢,這將是無效的。你需要ODM層上的東西。這是歧視者進場的地方。 你讓所有你在所有類型的書要密鑰的基礎模型,並添加discrimnator鍵(請參考文檔)。然後你從這個模型的鑑別器函數創建一個小說,並添加只有新穎的附加鍵。您可以按照這種方式創建儘可能多的子模型,然後以簡單的多態方式使用它們。在內部,這將創建一個名爲書籍的單一集合,但對於小說,它將只存儲小說的關鍵。 ODM層將處理不同類型模型的驗證,中間件等。 http://mongoosejs.com/docs/discriminators.html