これを例を挙げて説明します。コレクションarraysについて考えてみましょう。 。 arrというフィールドがあります これは埋め込まれたドキュメントの配列です (フィールドa およびb 。
arrays内のいくつかのドキュメント コレクション:
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
配列が埋め込まれているすべてのドキュメントを検索したい-ドキュメントフィールドa="a1" AND b="b1" 。これは、配列の同じ要素埋め込みドキュメント内にある必要があることに注意してください。 $ elemMatchを使用しています このために、望ましい結果を得ることができます。
> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
ここで、$とを使用すると 次のクエリのような演算子の場合、結果は正しくありません。ご覧のとおり、追加のドキュメントが選択されています。クエリは、配列の埋め込みドキュメントフィールドa="a1"で機能しました またはb="b1" 。
> db.arrays.find({$and: [ { "arr.a": "a1" }, { "arr.b": "b1" } ] } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
したがって、$andを使用します 演算子は、この目的(つまり、サブドキュメントの配列の複数のフィールドに対するクエリ)を目的としたものではありません。
また、配列の埋め込みドキュメントフィールド(1つのフィールドのみ)でクエリを実行します )$elemMatch 例:
> db.arrays.find( { "arr.a": "a2" } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }