Mongodb 使用$set更新嵌入文档
我有一份这种形式的文件Mongodb 使用$set更新嵌入文档,mongodb,mongodb-update,embedded-documents,Mongodb,Mongodb Update,Embedded Documents,我有一份这种形式的文件 { "firstName": "John", "lastName": "Doe", "preferences": { "xxx": true, "yyy": false, "zzz": true } } 我想更新首选项嵌入文档中的特定字段。如果我按以下方式使用$set操作数 db.users.update({name: "John"}, {$set: {preferences: {"xxx": false}}}
{
"firstName": "John",
"lastName": "Doe",
"preferences": {
"xxx": true,
"yyy": false,
"zzz": true
}
}
我想更新首选项
嵌入文档中的特定字段。如果我按以下方式使用$set
操作数
db.users.update({name: "John"}, {$set: {preferences: {"xxx": false}}})
首选项
文档被完全替换,所以我得到了这个
{
"firstName": "John",
"lastName": "Doe",
"preferences": {
"xxx": false
}
}
而我想得到这个
{
"firstName": "John",
"lastName": "Doe",
"preferences": {
"xxx": false,
"yyy": false,
"zzz": true
}
}
我不能使用:
db.users.update({name: "John"}, {$set: {"preferences.xxx": false}})
因为我不知道要更新哪个特定字段,所以我只有一个对象作为输入,该对象可能包含或不包含
首选项
文档的每个字段。尝试在更新之前创建更新对象。例如,如果您将对象{“xxx”:false,“abc”:false}
作为输入,您可以使用JavaScript的创建更新对象,如下所示:
var input = {"xxx": false, "abc": false},
update = { "$set": {} },
keys = Object.keys(input),
query = {"name": "John"};
keys.forEach(function(key){ update["$set"]["preference."+key] = input[key]; });
printjson(update); // {"$set":{"preference.xxx":false,"preference.abc":false}}
db.users.update(query, update);