Това всъщност е, което $elemMatch
операторът е за, въпреки че често се злоупотребява. По същество той изпълнява условията на заявката за всеки елемент "в" масива. Всички аргументи на MongoDB са операция "и", освен ако изрично не са извикани по друг начин:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
Вероятно също искате да „проектирате“ и тук, ако очаквате само съответстващото поле, а не целия документ:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
И накрая, за да обясните защо вторият ви опит не работи, тази заявка:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
Не съответства на нищо, тъй като няма действителен документ, в който „arr“ съдържа единствен елемент, който точно отговаря на вашите условия.
Първият ви пример е неуспешен..:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
Тъй като има няколко елемента на масива, които отговарят на условията и това не се счита само за това, че и двете условия се прилагат за един и същи елемент. Това е $elemMatch
добавя и когато имате нужда от повече от едно условие за съвпадение, тогава това е мястото, където го използвате.