Dette er faktisk hvad $elemMatch
operatør er til, selvom den ofte misbruges. Det udfører i det væsentlige forespørgselsbetingelserne på hvert element "inden for" arrayet. Alle MongoDB-argumenter er en "og"-operation, medmindre andet udtrykkeligt kaldes:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
Du vil sikkert også gerne "projektere" her, hvis du kun forventer det matchede felt og ikke hele dokumentet:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
Til sidst for at forklare, hvorfor dit andet forsøg ikke virker, denne forespørgsel:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
Matcher ikke noget, fordi der ikke er noget egentligt dokument, hvor "arr" indeholder et enkelt element, der nøjagtigt matcher dine betingelser.
Dit første eksempel mislykkedes..:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
Fordi der er flere array-elementer, der opfylder betingelserne, og dette anses ikke kun for, at begge betingelser gælder for det samme element. Det er hvad $elemMatch
tilføjer, og når du har brug for mere end én betingelse for at matche, så er det her, du bruger det.