2015-05-13 6 views
4

У меня есть документ в таком виде

{ 
    "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 
    } 
} 

I не может использоваться:

db.users.update({name: "John"}, {$set: {"preferences.xxx": false}}) 

, потому что я не знаю, какое конкретное поле я собираюсь обновить, у меня есть только входной объект, который может содержать или не содержать каждое поле документа preferences.

ответ

2

Попробуйте создать объект обновления до обновления. Например, если у вас есть в качестве входных данных объект {"xxx": false, "abc": false}, вы могли бы использовать в JavaScript bracket notation для создания объекта обновления следующим образом:

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);