MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

L'agrégat Moongoose $match ne correspond pas aux identifiants

Vos ids la variable sera construite de "chaînes", et non de ObjectId valeurs.

Valeurs de chaîne "autocasts" de Mongoose pour ObjectId dans leur type correct dans les requêtes régulières, mais cela ne se produit pas dans le pipeline d'agrégation, comme décrit dans le problème #1399.

Au lieu de cela, vous devez effectuer le casting correct pour taper manuellement :

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

Ensuite, vous pouvez les utiliser dans votre phase de pipeline :

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

La raison en est que les pipelines d'agrégation modifient "généralement" la structure du document, et donc mongoose ne présume pas que le "schéma" s'applique au document à une étape donnée du pipeline.

On peut soutenir que la "première" étape du pipeline lorsqu'il s'agit d'un $match étape devrait le faire, car en effet le document n'est pas altéré. Mais pour le moment, ce n'est pas comme ça que ça se passe.

Toutes les valeurs qui peuvent éventuellement être des "chaînes" ou du moins pas le bon type BSON doivent être transtypées manuellement pour correspondre.