2012-02-08 13 views
9

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

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

答えて

18

「オブジェクトの配列」パターンを使用しています。あなたはpositional operatorを使用することができ、それはこのようなものになります。私の経験で

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

を物体が自然なIDを持っている場合は、「配列オブジェクトの」パターンが最適ではありません。あなたが簡単にあなたが欲しいアイテムを更新するためにdot notationを使用することができます。この場合

{ 
    "_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 } }); 
+0

すごくうれしくありがとう! 2番目の選択肢に興味がありますが、途中でいくつかのエントリを削除する必要があるため、動作するかどうかはわかりません。 "users.2"は私が想定している配列の位置です。 –

+0

私はusers.2は、配列位置と呼ばしかし、それは実際にIDを使用して(とクール、}他のすべての配列項目のための空のブラケットを返すだと思った。 –

+0

はMongoDBのクエリでの配列を認識しています。だから、 'users.2'はを検索でき'ユーザーの配列 'key'が' 2' *であるオブジェクトを探している、または* 'keys:2''を' users'で見ることができます –

関連する問題