Ziemlich alte Frage, aber buchstäblich keine der vorgeschlagenen Antworten ist gut.
TLDR :
Sie können $elemMatch nicht in einer $project-Phase verwenden. Sie können jedoch dasselbe Ergebnis mit anderen Aggregationsoperatoren wie $filter.
erzielendb.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
Und wenn Sie nur das erste Element aus dem Array wollen, das der Bedingung entspricht, ähnlich wie bei $elemMatch, können Sie $arrayElemAt
integrierenAusführliche Erläuterung :
Lassen Sie uns zuerst $elemMatch verstehen:
$elemMatch ist ein Abfrageausdruck, obwohl auch diese Projektionsversion davon existiert. Dies bezieht sich auf eine Abfrageprojektion und nicht auf die $project-Aggregationsphase.
Na und? was hat das damit zu tun? Nun, eine $project-Phase hat eine bestimmte Eingabestruktur, während diejenige, die wir verwenden möchten, folgende ist:
Was ist ein gültiger Ausdruck?
Ausdrücke können Feldpfade, Literale, Systemvariablen, Ausdrucksobjekte und Ausdrucksoperatoren enthalten. Ausdrücke können verschachtelt werden.
Wir wollen also einen Ausdrucksoperator verwenden, aber wie Sie dem $elemMatch
des Dokuments entnehmen können gehört nicht dazu. daher ist es kein gültiger Ausdruck, der in einer Aggregation $project
verwendet werden kann Stufe.