Docela na starou otázku, ale doslova žádná z navrhovaných odpovědí není dobrá.
TLDR :
$elemMatch nemůžete použít ve fázi $projektu. ale stejného výsledku můžete dosáhnout pomocí jiných agregačních operátorů, jako je $filter.
db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
A pokud chcete jen první položku z pole, která odpovídá podmínce podobně jako $elemMatch, můžete začlenit $arrayElemAt
Hloubkové vysvětlení :
Nejprve pochopíme $elemMatch:
$elemMatch je výraz dotazu, i když existuje i jeho verze projekce, což se týká projekce dotazu a nikoli fáze agregace $project.
No a co? co to má společného s něčím? fáze $project má určitou vstupní strukturu, kterou může mít, zatímco ta, kterou chceme použít, je:
:
Co je platný výraz?
Výrazy mohou zahrnovat cesty polí, literály, systémové proměnné, objekty výrazů a výrazové operátory. Výrazy lze vnořovat.
Chceme tedy použít výrazový operátor, ale jak můžete vidět z dokumentu $elemMatch
není jeho součástí. proto to není platný výraz pro použití v agregaci $project
fázi.