2013-09-16 53 views
4

我有一組文檔需要保持持久性。由於MongoDB處理多文檔操作的方式,我需要將這組文檔嵌入到容器文檔中,以確保操作的原子性。Mongoose:保存爲子文檔的關聯數組與子文檔的數組

這些數據本身非常適合鍵值對。有沒有什麼辦法,而不是這樣做:

var container = new mongoose.Schema({ 
    // meta information here 
    subdocs: [{key: String, value: String}] 
}) 

我可以代替有subdocs是一個關聯數組(即對象),其適用的subdoc的驗證?因此,一個容器實例會看起來像:

{ 
    // meta information 
    subdocs: { 
     <key1>: <value1>, 
     <key2>: <value2>, 
     ... 
     <keyN>: <valueN>, 
    } 
} 

感謝

回答

4

使用貓鼬,我不相信有一種方法可以做到你所描述的。爲了解釋,我們舉一個例子,您的鍵是日期,值是高溫,以形成{「2012-05-31」:88}這樣的對。

讓我們看看結構你建議:

{ 
    // meta information 
    subdocs: { 
     "2012-05-30" : 80, 
     "2012-05-31" : 88, 
     ... 
     "2012-06-15": 94, 
    } 
} 

因爲你必須在貓鼬預先定義模式,必須提前瞭解您的鍵名。在這個用例中,我們可能不會提前知道我們將收集哪些日期數據,所以這不是一個好的選擇。

如果你不使用貓鼬,你可以做到這一點,沒有任何問題。 MongoDB的本身擅長插入新的鍵名值到現有的文檔:

> db.coll.insert({ type : "temperatures", subdocuments : {} }) 
> db.coll.update({ type : "temperatures" }, { $set : { 'subdocuments.2012-05-30' : 80 } }) 
> db.coll.update({ type : "temperatures" }, { $set : { 'subdocuments.2012-05-31' : 88 } }) 
{ 
    "_id" : ObjectId("5238c3ca8686cd9f0acda0cd"), 
    "subdocuments" : { 
     "2012-05-30" : 80, 
     "2012-05-31" : 88 
    }, 
    "type" : "temperatures" 
} 

在這種情況下,在頂部加入貓鼬的MongoDB中帶走一些MongoDB的原生靈活性。如果你的用例非常適合MongoDB的這個特性,那麼使用Mongoose可能不是最好的選擇。

2

雖然您應該檢查對貓鼬驗證和轉換機制的影響,但您可以在貓鼬模式中使用{strict:false}來實現此行爲。

var flexibleSchema = new Schema({},{strict: false}) 

另一種方法是使用schema.add method,但我不認爲這是正確的解決方案。

我看到的最後一個解決方案是將所有的數組都取到客戶端,並使用underscore.js或任何庫。但這取決於您的應用程序,文檔大小,溝通步驟等。