2015-12-23 25 views
6
{ 
"_id" : "xPBc4By8FemDwTPqH", 
"u" : { 
    "_id" : "6PoZawHZcQz4Gwzcv", 
    "username" : "michael" 
}, 
"friends" : [ 
    { 
     "u" : { 
      "_id" : "eGqDjAjjtYADbuSnn", 
      "username" : "michael", 
      "name" : "michael" 
     } 
    }, 
    { 
     "u" : { 
      "_id" : "k4gKCGwYryXDMMHvs", 
      "username" : "joyce", 
      "name" : "joyce" 
     } 
    } 
] 
} 

"friends.u.username"の名前を更新したいとします。 "michael"の名前は "hello"です。MongoDB - ネストされた配列内のオブジェクトを更新する

答えて

17

$set演算子を$ positional operatorと共に更新プログラムに適用して、nameフィールドを変更してください。

$ positional operatorは、このように最終的な更新ステートメントがどのように見えるべきで、明示的に配列内の要素の位置を指定せずに更新するには、配列内の正しい要素を識別します:

db.collection.update(
    { "friends.u.username": "michael" }, 
    { "$set": { "friends.$.u.name": "hello" } } 
) 
+0

は何も起こりません...私のために働いていないが、私は '0'の代わりに '$'と、アレイ上の(誤った)要素が – Dherik

+0

@Dherikを変更している使用している場合、あなたは疑問を持っていますかあなたの問題の詳細については既に?そうでない場合は、サンプル文書と希望する結果で作成することはできますか? – chridam

+0

もう少しお試しになります。 Robo3Tと下位互換性に問題があるかもしれません:https://stackoverflow.com/questions/4669178/how-to-update-multiple-array-elements-in-mongodb/46054172#46054172何も動作しない場合、私は質問を開きます。ありがとうございました! :) – Dherik

1

あなたは$の集合演算子を使用することができます。何らかの理由で

> db.test.update({"friends.u._id":"eGqDjAjjtYADbuSnn"},{$set:{"friends.$.u.name":"hello"}}) 
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 
関連する問題