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