sql >> Database teknologi >  >> NoSQL >> MongoDB

Moongoose samlede $match matcher ikke id'er

Dine ids variabel vil være konstrueret af "strenge" og ikke ObjectId værdier.

Mongoose "autocasts" strengværdier for ObjectId ind i deres korrekte type i almindelige forespørgsler, men dette sker ikke i aggregeringspipelinen, som beskrevet i nummer #1399.

I stedet skal du udføre den korrekte casting for at skrive manuelt:

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

Så kan du bruge dem i din pipeline fase:

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

Årsagen er, at aggregeringspipelines "typisk" ændrer dokumentstrukturen, og derfor gør mongoose ingen formodning om, at "skemaet" gælder for dokumentet i et givet pipelinestadium.

Det kan diskuteres, at det "første" pipeline-stadium, når det er en $match fase bør gøre dette, da dokumentet faktisk ikke er ændret. Men lige nu er det ikke sådan det sker.

Alle værdier, der muligvis er "strenge" eller i det mindste ikke den korrekte BSON-type, skal castes manuelt for at matche.



  1. MongoDB $sekund

  2. MongoDB $type Query Operator

  3. Mongoose:findOneAndUpdate returnerer ikke opdateret dokument

  4. zmq vs redis for pub-sub-mønster