2012-09-30 87 views
15

我想用我的node.js應用程序開始使用Mongoose作爲MongoDB的ODM。我注意到,當我設計一個帶有嵌入式文檔的模式時,如果我不向它添加值,它會在Mongo中存儲一個空白數組「[]」。爲什麼是這樣?我試圖存儲對記錄的歷史更改,而空白數組意味着該更改會刪除該值。這是一個示例模式。爲什麼Mongoose添加空白數組?

schema.Client = new mongoose.Schema({ 
    name:{type:String, required:true}, 
    products:[{ 
     name:{type:String, index:true}, 
     startDate:Date, 
     endDate:Date 
    }], 
    subdomain:{type:String, index:{unique:true}}, 
}) 

這裏是所產生的文件時,我保存剛纔的名稱和子文件。

{ 
    "name": "Smith Company", 
    "products": [], 
    "subdomain": "smith" 
} 

它爲什麼默認添加空白數組的產品,我該如何阻止它?

+0

一個數組的默認值是一個空數組,所以如果你只保存{名:「富」,子域:「酒吧」}產品將是一個空陣列。 – supernova

+0

有沒有辦法改變數組的默認值,導致它不寫任何東西? – wintzer

+0

你可以在哪裏更新你的文檔嗎? – supernova

回答

0

因爲在模式中您定義的產品爲對象的數組。你需要嘗試類似:

products: { 
     name:{type:String, index:true}, 
     startDate:Date, 
     endDate:Date 
    }, 

這將代替存儲陣列的一個空的對象。

+2

我希望它是一個數組,因爲一個文檔可能包含對多個產品的引用。如果我沒有放入任何數據,我不希望它向數據庫寫入任何內容。 – wintzer

+0

我認爲這甚至沒有寫入數據庫 - 你檢查過嗎? 我有一個模型,而不會陣列,並且當我剛添加對象id和陣列'。findOne''d其中一個模型實例'.toJSON'在響應中添加了空列表,即使我之前沒有寫入數據庫。 – sol

12

空白陣列爲您提供添加或刪除模型中元素的便捷方法。

$push$addToSet$pull在更新將幫助您管理您的數組元素。

如果你沒有一個空數組,那麼你不能把要素null

但它有可能在空白陣列

+10

有些情況下,你會希望缺少一個屬性來代表「與本文無關」。當這是一件普通的事情時,擁有一堆空陣列是一件很難的浪費。它似乎擊敗了文檔數據庫的一個優點,即能夠在同一個集合中存儲不同的文檔結構。我希望看到空白數組在文檔中不會產生任何屬性的能力,除非空白數組明確是要保存的模型的一部分。這也很直觀。這或爲什麼在MongoDB中無法解釋。 – neverfox

3

這似乎是由設計,但採用「預」處理程序來刪除默認的空數組這裏解決方法:https://github.com/LearnBoost/mongoose/issues/1335

這只是工作的我,當我的字段設置爲null,雖然。如果我將其設置爲undefined(如示例代碼中所示),則空數組似乎會返回。

3

可以解決辦法通過定義架構如下圖所示:

products: { 
    type: [{ 
    name:String, 
    startDate:Date, 
    endDate:Date 
    }], 
    default: undefined 
}