2013-06-04 71 views
5

我不知道爲什麼,但如果我嘗試使用$set方法更新現有字段,則任何現有字段都會在相同的上下文中替換。更新流星集,但不刪除或覆蓋現有字段

例如。假設我有一個現有的以下字段的集合。

集合名稱:Ticket

{profile: {name: "Test", placement: 1}, requestor: _id} 

當我試圖/更新字段添加到這個集合是這樣的:

var ticket = Meteor.tickets.findOne({_id: ticketID}); 

if(ticket){ 
    Meteor.users.update(ticket, { 
         $set: profile: {name: "Test2", new_fields: "value"} 
        }); 
} 

收集更新,並且場的變化,但位置被刪除名字並不再存在。這也是如果我刪除name字段也是如此。我們如何正確更新流星收藏,而不必一再傳遞相同的結構?

回答

9

只是這樣做:

$set: {"profile.name": "Test2", "profile.new_fields": "value"} 

即你正在替換整個散列。相反,您可以更新散列內的字段。

+0

就像你發佈這個,我發現這一點。 http://stackoverflow.com/questions/10290621/how-do-i-partially-update-an-object-in-mongodb-so-the-new-object-will-overlay。將在幾分鐘內接受。謝謝 – Warz

0

如果您想要更改的字段具有唯一索引,則可以將該特定字段修改爲您想要的字段而不破壞字段中的其餘信息。

db.artists.find() 

{"_id":ObjectId("1"),"name":"A1","media_id":["m1","m2" ]} 

{"_id":ObjectId("2"),"name":"A2","media_id":["m2","m3"]} 

{"_id":ObjectId("3"),"name":"A3","media_id":["m3","m1","m2"]} 

db.artists.ensureIndex({"name":1}) 

db.artists.update(
    {name:"A1"}, 
    {$set: { name:"A4"}}, 
    { upsert: true } 
    ) 

b.artists.find() 

{"_id":ObjectId("1"),"name":"A4","media_id":["m1","m2" ]} 

{"_id":ObjectId("2"),"name":"A2","media_id":["m2","m3"]} 

{"_id":ObjectId("3"),"name":"A3","media_id":["m3","m1","m2"]} 

我自己在MongoDB中很新,但這對我來說工作得很好。