2014-03-06 38 views
0

這裏更新下方數組的一個複雜的項目再一次我假設的用戶集合,其中多個地址被允許:的MongoDB:如何用新的複雜項目

{ 
    "firstName": "Joe", 
    "lastName": "Grey", 
    ... 
    "addresses": 
    [ 
    { 
     "name": "Default", 
     "street": "...", 
     ..., 
     "isDefault": true 
    }, 
    { 
     "name": "Home", 
     "street": "...", 
     ..., 
     "isDefault": false 
    }, 
    { 
     "name": "Office", 
     "street": "...", 
     ..., 
     "isDefault": false 
    } 
    ] 
} 

讓我們假設我想更新第二個地址(Home)具有以下新項目:

{ 
     "name": "New home", 
     "street": "Ruta del Sol" 
    }, 

如何更新與新項目的陣列的第二個項目,又考慮到新項目可能會或可能不會提供一個地址的所有字段?

this post將向我展示如何更新給定索引處的字段,確保地址名稱保持唯一。現在,我不想更新單個字段,而想更新整個項目。

+0

告訴我們你試過的東西。 – hanleyhansen

+0

我剛更新了我的帖子。 TX。 – j3d

回答

1

所有你需要做的就是轉換新的json數據以便更新。例如:

讓我們假設你有隻有兩個字段'name'和'isDefault'的新Json數據。

var newData = {"name" : "New Val","isDefault":true}; 
var updateData = {}; 
for (key in newData) { 
     updateData["addresses.$."+key]=newData[key]; 
}; 
db.projectPlan.update({_id:1, 'addresses.name': 'Home'}, {$set:updateData}); 
+0

我認爲您的建議與Will提出的解決方案具有相同的問題...未在「newData」中指定的字段僅丟失。 – j3d

+0

我有更新我的答案,它有一個錯誤。在for循環中,它必須迭代newData,以前它是updateData。只是測試它對我的工作很好。@ j3d – Sumeet

+0

對我來說不幸的是:「{」$ set「:{」name「:」default「,」zip「:」9999「}}」將所有其他字段(如城市,國家等)。 – j3d

0
var renamed = 'Office'; // from user input 
var users = getUserMongoCollection();  

var address = { 
name: "Office, 
street: "Ruta del Sol" 
}; 

users.update({_id:userId }, 
    { $set : { 'addresses.1' : address } }, function(err){ 
     //all done! 
    }); 
+0

我認爲問題是動態更新。 ?任何字段都可以更新,在這種情況下無法使用位置@Will Shaver – Sumeet