Обновите встроенный документ с помощью $set
У меня есть документ в этой форме
{
"firstName": "John",
"lastName": "Doe",
"preferences": {
"xxx": true,
"yyy": false,
"zzz": true
}
}
Я хочу обновить определенные поля в preferences
встроенный документ Если я использую $set
операнд следующим образом
db.users.update({name: "John"}, {$set: {preferences: {"xxx": false}}})
preferences
документ полностью заменен, так что я получаю это
{
"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}})
поскольку я не знаю, какое конкретное поле я собираюсь обновить, в качестве входных данных у меня есть только объект, который может содержать или не содержать каждое поле preferences
документ.
1 ответ
Попробуйте создать объект обновления до обновления. Например, если у вас есть в качестве входных данных объект {"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);