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

我不能使用:

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

因为我不知道要更新哪个特定字段,所以我只有一个可能包含或不包含preferences文档每个字段的对象作为输入。

4

1 回答 1

2

尝试在更新之前创建更新对象。例如,如果你有 object 作为输入{"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);
于 2015-05-13T14:56:32.710 回答