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

Das Moongoose-Aggregat $match stimmt nicht mit den IDs überein

Ihre ids Die Variable wird aus "Strings" und nicht aus ObjectId konstruiert Werte.

Mongoose "castet" String-Werte für ObjectId automatisch in ihren korrekten Typ in regulären Abfragen, aber dies geschieht nicht in der Aggregationspipeline, wie in Ausgabe Nr. 1399 beschrieben.

Stattdessen müssen Sie die richtige Umwandlung durchführen, um manuell einzugeben:

ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })

Dann können Sie sie in Ihrer Pipeline-Phase verwenden:

{ "$match": { "_id": { "$in": ids } } }

Der Grund dafür ist, dass Aggregations-Pipelines „normalerweise“ die Dokumentstruktur ändern und Mongoose daher nicht davon ausgeht, dass das „Schema“ auf das Dokument in einer bestimmten Pipeline-Phase zutrifft.

Es ist fraglich, ob die „erste“ Pipeline-Stufe ein $match ist stage sollte dies tun, da das Dokument tatsächlich nicht verändert wird. Aber im Moment passiert das nicht.

Alle Werte, die möglicherweise "Strings" oder zumindest nicht der richtige BSON-Typ sind, müssen manuell umgewandelt werden, damit sie übereinstimmen.