更新流星集合而不删除或覆盖现有字段

时间:2013-06-04 23:47:21

标签: mongodb meteor updates

我不知道为什么,但如果我尝试使用$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字段,也是如此。我们如何正确更新流星集合而不必一遍又一遍地传递相同的结构?

2 个答案:

答案 0 :(得分:9)

这样做:

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

即。你正在替换整个哈希。相反,您可以更新散列中的字段。

答案 1 :(得分: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中很新,但这对我来说非常好。