Ganska på gammal fråga men bokstavligen inget av de föreslagna svaren är bra.
TLDR :
Du kan inte använda $elemMatch i ett $projektstadium. men du kan uppnå samma resultat med andra aggregeringsoperatorer som $filter.
db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
Och om du bara vill ha det första objektet från arrayen som matchar villkoret på samma sätt som vad $elemMatch gör kan du införliva $arrayElemAt
Ingående förklaring :
Låt oss först förstå $elemMatch:
$elemMatch är ett frågeuttryck medan även den här projektionsversionen av den existerar, detta hänvisar till en frågeprojektion och inte $project aggregeringsstadiet.
Än sen då? vad har detta med något att göra? väl ett $projekt-steg har en viss indatastruktur det kan ha medan den vi vill använda är:
:
Vad är ett giltigt uttryck?
Uttryck kan inkludera fältvägar, literaler, systemvariabler, uttrycksobjekt och uttrycksoperatorer. Uttryck kan kapslas.
Så vi vill använda en uttrycksoperator, men som du kan se från dokumentets $elemMatch
är inte en del av det. därför är det inte ett giltigt uttryck som ska användas i ett aggregerings $project
skede.