To je vlastně to, co $elemMatch
operátor je pro i když je často zneužíván. V podstatě provádí podmínky dotazu na každý prvek "uvnitř" pole. Všechny argumenty MongoDB jsou operace „a“, pokud není výslovně uvedeno jinak:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
Pravděpodobně zde také budete chtít "promítnout", pokud očekáváte pouze odpovídající pole a ne celý dokument:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
Nakonec, abyste vysvětlili, proč váš druhý pokus nefunguje, tento dotaz:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
Neodpovídá ničemu, protože neexistuje žádný skutečný dokument, kde by „arr“ obsahoval singulární prvek přesně odpovídající vašim podmínkám.
Váš první příklad selhal..:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
Protože existuje několik prvků pole, které splňují podmínky, a to není jen považováno za to, že obě podmínky platí pro stejný prvek. To je to, co $elemMatch
dodává, a když potřebujete, aby se shodovala více než jedna podmínka, použijte ji zde.