2017-05-23 10 views
0

私は '$'を使ってリスト内の特定のアイテムを更新しようとしています。項目はfirstNameとlastNameの両方で決まります。このシナリオでは、firstName + lastNameの組み合わせは一意です。だからここ

は、だから私は、リスト内の項目3で強蘭の年齢を変更しようとしている私の文書

{ 
"_id" : ObjectId("592403125ec4f65fb02e36a0"), 
"friends" : [ 
    { 
     "age" : 30.0, 
     "fname" : "qiang", 
     "lname" : "he" 
    }, 
    { 
     "age" : 31.0, 
     "fname" : "deng", 
     "lname" : "pan" 
    }, 
    { 
     "age" : 22.0, 
     "fname" : "xiong", 
     "lname" : "lan" 
    }, 
    { 
     "age" : 23.0, 
     "fname" : "qiang", 
     "lname" : "lan" 
    } 
] 
} 

です。しかし、彼はアイテム0と私が使用するコード2項目と同じlastNameのと同じfirstNameのがあるしています

db.getCollection('test').update({'friends.fname': 'qiang', 'friends.lname': 'lan'}, {$set:{'friends.$.age': 50}}) 

このコードは、強蘭の年齢を変更していないが、それは50にアイテム0強彼の年齢を変更しましたこれは私の言葉のうちの一番早い試合です。したがって、この用語は実際にはANDではなくORとして扱われます。

これは、firstName + lastNameに等しいfullNameフィールドを追加し、更新時にfullNameと一致させることで解決できることがわかっています。私はちょうど把握しようとしています、目的のためにこれのように行動するように設計された '$'ですか、それとも間違って使用していますか?

ありがとうございます!

答えて

1

これはよくある間違いです。 $elemMatchなければ

db.getCollection('test').update(
    { "friends": { "$elemMatch": { "fname": 'qiang', "lname": 'lan'} }, 
    { "$set":{ "friends.$.age": 50 } } 
) 

クエリ条件は「全体」の配列を検討している、と「どちらかfnameにマッチします:あなたは実際には使用量が「同じ配列項目に複数の条件」のためであることを意図していますように、ここで$elemMatchをしたいです「任意の配列要素の中の "lname"これがupdate()が文句を言う理由です。

+0

これは動作します!ありがとう! – IPE

0

使用して状態を確認してください。

$二つ以上 式(例えば、等)のアレイ上の論理AND演算を実行して、アレイ内のすべての式を満たす ドキュメントを選択します。

db.getCollection('test').update({$and:[{'friends.fname': 'qiang'}, {'friends.lname': 'lan'}], {$set:{'friends.$.age': 50}}) 
+0

[すべてのmongodbクエリ引数は、すでに "AND"条件です(https://docs.mongodb.com/manual/tutorial/query-documents/#specify-and-conditions)。だから '$と'はここでは何も提供しません。これは意図した使い方ではありません。ここでのクエリは、本質的に、エラーを生成しているOPの質問と全く同じです。 –

+0

@NeilLunnあなたの情報に感謝 –

関連する問題