これは実際には、 $elemMatch
>
誤用されることが多いのですが、演算子はのためのものです。基本的に、配列の「内部」の各要素に対してクエリ条件を実行します。他に明示的に呼び出されない限り、すべてのMongoDB引数は「and」操作です:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
ドキュメント全体ではなく、一致するフィールドのみを期待している場合は、ここでも「プロジェクト」を行うことをお勧めします。
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
最後に、2回目の試行が機能しない理由を説明するために、次のクエリを実行します。
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
「arr」に条件に完全に一致する単一の要素が含まれている実際のドキュメントがないため、何にも一致しません。
最初の例は失敗しました..:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
条件を満たす配列要素がいくつかあり、これは両方の条件が同じ要素に適用されると見なされるだけではないためです。それが$elemMatch
追加し、一致する条件が複数必要な場合は、ここで使用します。