Helt på et gammelt spørgsmål, men bogstaveligt talt er ingen af de foreslåede svar gode.
TLDR :
Du kan ikke bruge $elemMatch i en $projektfase. men du kan opnå det samme resultat ved at bruge andre aggregeringsoperatorer som $filter.
db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
Og hvis du kun vil have det første element fra arrayet, der matcher betingelsen på samme måde som $elemMatch, kan du inkorporere $arrayElemAt
Udgående forklaring :
Lad os først forstå $elemMatch:
$elemMatch er et forespørgselsudtryk, mens også denne projektionsversion af det eksisterer, dette refererer til en forespørgselsprojektion og ikke $project aggregeringsstadiet.
Og hvad så? hvad har dette med noget at gøre? godt et $projektstadium har en bestemt inputstruktur, det kan have, mens det, vi vil bruge, er:
Hvad er et gyldigt udtryk?
Udtryk kan omfatte feltstier, literaler, systemvariabler, udtryksobjekter og udtryksoperatorer. Udtryk kan indlejres.
Så vi vil bruge en udtryksoperator, men som du kan se fra dokumentets $elemMatch
er ikke en del af det. derfor er det ikke et gyldigt udtryk, der skal bruges i et aggregerings $project
scene.