16

配列に埋め込まれたドキュメント全体を簡単に置き換える方法はありますか? 置き換えて言う:

{
   "_id" : "2",
      "name" : "name2",
      "xyz..." : "xyz2..."
}

と:

{
   "_id" : "2",
      "name" : "name6",
      "xyz..." : "xyz5..."
      "morefields..." : "fields..."
}

_id (埋め込み) を検索しています。または、$set を使用して各フィールドを個別に置き換える必要がありますか?

{
  "_id" : "2",
  "users" : [{
      "_id" : "1",
      "name" : "name1",
      "xyz..." : "xyz1..."
    }, {
      "_id" : "2",
      "name" : "name2",
      "xyz..." : "xyz2..."
    }],
  "name" : "main name"
}
4

1 に答える 1

24

「オブジェクトの配列」パターンを使用しています。位置演算子を使用できます。次のようになります。

coll.update( {'_id':'2', 'users._id':'2'}, {$set:{'users.$':{ "_id":2,"name":"name6",... }}}, false, true)

私の経験では、オブジェクトに自然な ID がある場合、「オブジェクトの配列」パターンは最適ではありません。あなたの場合、これは次のようにモデル化できます。

{
  "_id" : "2",
  "users" : 
    { "1" : { "name" : "name1", "xyz..." : "xyz1..." }, 
      "2" : { "name" : "name2", "xyz..." : "xyz2..." }
    }
  "name" : "main name"
}

この場合、ドット表記を使用して、必要なアイテムを簡単に更新できます。

var newValue = {  "name" : "name6", "xyz..." : "xyz5...", "morefields..." : "fields..." };
coll.update({_id: 2}, { $set: { "users.2" : newValue } });
于 2012-02-08T20:54:29.593 に答える