2

次のようなmongoドキュメントがあります。

{ 
   "_id" : '4fb2a4809ad7324ccba1f6b8',
   "events" : { 
     "4fb2a4809ad7324ccba1f6b9" : {a:{z:1},b:{z:2},c:{z:3}},
     "4fb2a4809ad7324ccba1f610" : {a:{z:1},b:{z:2},c:{z:3}}
   } 
} 

次に、サーバーに更新オブジェクトが送信されます。

update = { 
  _id = '4fb2a4809ad7324ccba1f6b8', 
  event_id: '4fb2a4809ad7324ccba1f610', 
  changed_data: {a:{b:3}} 
} 

ab = 3 が作成または変更されました。これは a = {b:3} という意味ではないため、ドキュメントに既に保存されている既存の az = 1 を上書きしたくありません。

これらの変更のアトミック更新を作成するにはどうすればよいですか? 私が理解できない主なことは、コマンドに変数を渡してサブオブジェクトをターゲットにする方法です。(node-mongodb-native を使用)

助けてくれてありがとう!

更新されたドキュメントは次のようになります。

{ 
   "_id" : '4fb2a4809ad7324ccba1f6b8',
   "events" : { 
     "4fb2a4809ad7324ccba1f6b9" : {a:{z:1},b:{z:2},c:{z:3}},
     "4fb2a4809ad7324ccba1f610" : {a:{z:1, b:3},b:{z:2},c:{z:3}}
   } 
} 
4

2 に答える 2

1
for (var id in update.changed_data) {
  for (var sub_id in update.changed_data[id]) {
    db.collection.update({ "_id" : update._id, "$atomic" : "true" },{ $set: {'events.' + update.event_id + '.'+ id +'.' + sub_id : update.changed_data[id][sub_id] } });
  }
}

この URL も確認できます: http://www.mongodb.org/display/DOCS/Updating#Updating-ModifierOperations

于 2012-05-17T13:11:23.720 に答える