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 に答える