Das ist eigentlich das, was der $elemMatch
Operator ist für, obwohl er oft missbraucht wird. Es führt im Wesentlichen die Abfragebedingungen für jedes Element "innerhalb" des Arrays aus. Alle MongoDB-Argumente sind eine „und“-Operation, sofern nicht ausdrücklich anders aufgerufen:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
Wahrscheinlich möchten Sie auch hier "projizieren", wenn Sie nur das übereinstimmende Feld und nicht das gesamte Dokument erwarten:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
Um schließlich zu erklären, warum Ihr zweiter Versuch nicht funktioniert, diese Abfrage:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
Stimmt mit nichts überein, da es kein tatsächliches Dokument gibt, in dem "arr" ein singuläres Element enthält, das genau Ihren Bedingungen entspricht.
Ihr erstes Beispiel ist fehlgeschlagen..:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
Da es mehrere Array-Elemente gibt, die die Bedingungen erfüllen und dies nicht gerade berücksichtigt wird, gelten beide Bedingungen für dasselbe Element. Das ist $elemMatch
fügt hinzu, und wenn Sie mehr als eine Bedingung erfüllen müssen, dann verwenden Sie sie hier.