MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie verwendet man $elemMatch für die Projektion von Aggregaten?

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.

erzielen
db.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

integrieren

Ausfü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.