Dit is eigenlijk wat de $elemMatch
operator is voor ook al wordt het vaak misbruikt. Het voert in wezen de queryvoorwaarden uit op elk element "binnen" de array. Alle MongoDB-argumenten zijn een "en"-bewerking, tenzij expliciet anders genoemd:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
U wilt hier waarschijnlijk ook "projecteren" als u alleen het overeenkomende veld verwacht en niet dat hele document:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
Ten slotte om uit te leggen waarom uw tweede poging niet werkt, deze vraag:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
Komt met niets overeen omdat er geen echt document is waarin "arr" een enkelvoudig element bevat dat exact overeenkomt met uw voorwaarden.
Je eerste voorbeeld is mislukt..:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
Omdat er meerdere array-elementen zijn die aan de voorwaarden voldoen en daarbij wordt niet zomaar aangenomen dat beide voorwaarden van toepassing zijn op hetzelfde element. Dat is wat $elemMatch
voegt toe, en als je meer dan één voorwaarde nodig hebt om te voldoen, dan is dit waar je het gebruikt.