Detta är faktiskt vad $elemMatch
operatör är för även om den ofta missbrukas. Den utför i huvudsak frågevillkoren för varje element "inom" arrayen. Alla MongoDB-argument är en "och"-operation om inte annat uttryckligen kallas:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
Du vill förmodligen också "projektera" här också om du bara förväntar dig det matchade fältet och inte hela dokumentet:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
Slutligen för att förklara varför ditt andra försök inte fungerar, denna fråga:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
Matchar ingenting eftersom det inte finns något verkligt dokument där "arr" innehåller ett singularelement som exakt matchar dina villkor.
Ditt första exempel misslyckades...:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
Eftersom det finns flera arrayelement som uppfyller villkoren och detta anses inte bara att båda villkoren gäller för samma element. Det är vad $elemMatch
lägger till, och när du behöver mer än ett villkor för att matcha, då är det här du använder det.