Обновите встроенный документ с помощью $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);
Другие вопросы по тегам