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如果我删除该字段也是如此。我们如何正确更新流星集合,而不必一遍又一遍地传递相同的结构?

4

2 回答 2

9

只需这样做:

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

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

于 2013-06-04T23:50:57.787 回答
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 的新手,但这对我来说效果很好。

于 2015-06-05T19:23:02.793 回答