2015-01-13 1 views
11

私はこのようなコレクションを持っていると仮定します。モンゴクエリ

{ "arr" : [ { "name" : "a", "num" : 1 }, { "name" : "a", "num" : 2 } ] }, 
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "a", "num" : 2 } ] }, 
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "b", "num" : 2 } ] } 

を、私はarrname =「B」とnumとサブ文書が含まれていますすべてのドキュメントを検索します私はこのようなクエリを行う場合= 2

db.collection.find({ 
    $and: [ 
     { "arr.name": "b" }, 
     { "arr.num": 2 } 
    ] 
}); 

を彼らそれぞれがsuコマンドが含まれているので、それがコレクション内のすべての文書を返します。すべてのエラーをスローしませんが、まだ何も結果を返しません

db.collection.find({ 
    arr: [ 
     { "name": "b", "num": 2 } 
    ] 
}); 

:私もこれを試してみた「B」のnameまたはnum 2の

のいずれかでのB-文書。

MongoDBの複数のサブドキュメントフィールドをどのようにクエリしますか?

答えて

22

実際には$elemMatch演算子は、誤用されることが多いですが、基本的に、配列内の各要素に対してクエリ条件を実行します。明示的に呼び出されない限り、すべてのMongoDBの引数「と」操作している:

db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } }) 

あなたはおそらくも、あなたが のみマッチしたフィールドを期待していない場合に、そのドキュメント全体だけでなく、ここで「プロジェクト」にしたい:

実際のDOがないため

db.collection.find({ 
    "arr": [ 
     { "name": "b", "num": 2 } 
    ] 
}) 

何も一致しません:最後に、あなたの第二の試みがうまくいかない理由は、このクエリを説明するため

db.collection.find(
    { "arr": { "$elemMatch": { "name": "b", "num": 2 } } }, 
    { "arr.$": 1 } 
) 

あなたの条件にちょうど一致する特異な要素が "arr"に含まれています。

あなたの最初の例では、失敗..:

db.collection.find({ 
    $and: [ 
     { "arr.name": "b" }, 
     { "arr.num": 2 } 
    ] 
}); 

の条件を満たし、これはちょうど両方の条件が同じ要素には適用されていると考えていないいくつかの配列の要素があるので。つまり、$elemMatchが追加され、一致する条件が1つ以上必要な場合は、これが使用されます。

+1

非常に便利で完全な答えです。アップビューを2回ほど行えないのは残念です。ありがとうNeil! – Moppo