2014-04-01 82 views
0

在更新陣列我有以下結構:的MongoDB - 對象數組

{ 
     data: [ 
     {pos:"0", 
     moreData: ["a", "b"] 
     }, 
     {pos:"1", 
     moreData: ["a", "c"] 
     }, 
    ]} 

我想和更新來更新上述結構。我想在pos = 1的位置添加一個字母給moreData。這是應該的樣子結尾:

{ 
     data: [ 
     {pos:"0", 
     moreData: ["a", "b"] 
     }, 
     {pos:"1", 
     moreData: ["a", "c", "d"] 
     }, 
    ]} 

我這樣做,此刻:(使用貓鼬,但無論是罰款)

model.update({"data.pos":"1"}, 
       { $push: {data:{ pos:"1", moreData:["d"] } } }, 
       { safe: true, upsert: false }, function(err){ 
    }); 

所有我得到的是重複的「pos」:「1」,其中「moreData」只包含新元素「d」。 任何幫助將不勝感激。提前致謝!

回答

0

這裏的問題是你需要推到正確的數組元素。你可以直接由點標記和索引值或通過使用操作者positional $做到這一點:

model.update(
    {"data.pos": "1" }, 
    { "$push": { "data.$.moreData": "d" } }, 
    function(err, numAffected) { 

}) 

這應該以「數據」陣列的選擇的索引相匹配來執行更新。但要小心,你有嵌套的數組,你將無法匹配和更新內部數組中的項目。請參閱此位置的操作員文檔

+0

感謝您的快速回復!我已經嘗試過你的解決方案,但它不會向數據庫添加任何內容。 我想,因爲你已經提到的,是你不能使用$嵌套數組。 –

+0

@ user881387是否與您的問題有所不同?這對您提供的數據起作用。您可以使用$嵌套數組,但只匹配** **第一要素,那就是所有需要在這種情況下。當你想改變些什麼了「C」元素「MOREDATA」到「B」只成爲一個問題。在那裏你不能匹配**兩個**數組索引。但是像上面這樣的$ push操作沒有任何問題。 –

+0

@ user881387並不是最好的嘗試,並在後期的意見,因爲它是非常難以閱讀。但你似乎在問你與你的問題有所不同。答案是給你的問題,如果你有另一個問題,然後張貼另一個問題。給出的語句**將在給定的條件下將「d」元素添加到您的數組中。 –

0

有一些問題與您的數據結構,{"data.pos": 1}選擇整個文檔(所以$推不作爲的預期):

> db.demo.find({"data.pos": "1"}) 
{ "_id" : ObjectId("533a850fd15748cc2dc1a17f"), "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] } ] } 

嘗試增加一個id或東西您的文檔:

> db.demo.find({"id": "foo"}) 
{ "_id" : ObjectId("533a85c9d15748cc2dc1a180"), "id" : "foo", "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] } ] } 
> db.demo.update({"id": "foo"}, {"$push": { "data" : { "pos": "2", "moreData": ["c", "d"]}}}) 
> db.demo.find({"id": "foo"}) 
{ "_id" : ObjectId("533a85c9d15748cc2dc1a180"), "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] }, { "pos" : "2", "moreData" : [ "c", "d" ] } ], "id" : "foo" } 

似乎做你想做的。

+0

感謝您的快速回復。正如您在解決方案中所建議的那樣,您正在爲第一級陣列添加一個新的「pos」。我想添加的是現有「pos」的「moreData」數組的新數據。 –

+0

看看Neil的解決方案是否有效。 MongoDB中嵌套的數組可能是骯髒的(我想是否可以變通的辦法!) – marco