更新Meteor集合时不要删除或覆盖现有字段

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字段,也是如此。我们如何正确地更新meteor集合,而无需一遍又一遍地传递相同的结构?
2个回答

9

只需执行以下操作:

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

即你曾经替换整个哈希表。相反,你可以更新哈希表中的字段。


就在你发布这个内容的时候,我找到了这个链接。https://dev59.com/3Wkv5IYBdhLWcg3w4kl2。几分钟后会接受。谢谢。 - 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方面也比较新,但这对我来说运行得相当不错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接