La méthode de recherche de Mongoose avec $ ou condition ne fonctionne pas correctement

Récemment, je commence à utiliser MongoDB avec Mongoose sur Nodejs.

Lorsque j’utilise la méthode Model.find avec le champ $or condition et _id , Mongoose ne fonctionne pas correctement.

Cela ne fonctionne pas:

 User.find({ $or: [ { '_id': param }, { 'name': param }, { 'nickname': param } ] }, function(err, docs) { if(!err) res.send(docs); }); 

Au fait, si je supprime la partie “_id”, cela fonctionne!

 User.find({ $or: [ { 'name': param }, { 'nickname': param } ] }, function(err, docs) { if(!err) res.send(docs); }); 

Et dans le shell MongoDB, les deux fonctionnent correctement.

Je l’ai résolu par googling:

 var ObjectId = require('mongoose').Types.ObjectId; var objId = new ObjectId( (param.length < 12) ? "123456789012" : param ); // You should make string 'param' as ObjectId type. To avoid exception, // the 'param' must consist of more than 12 characters. User.find( { $or:[ {'_id':objId}, {'name':param}, {'nickname':param} ]}, function(err,docs){ if(!err) res.send(docs); }); 

J’implore tout le monde à utiliser le langage de générateur de requêtes de Mongoose et promet au lieu de rappels:

 User.find().or([{ name: param }, { nickname: param }]) .then(users => { /*logic here*/ }) .catch(error => { /*error logic here*/ }) 

En savoir plus sur les requêtes Mongoose .

Selon la documentation de mongoDB: “… Pour que MongoDB utilise des index pour évaluer un $ ou une expression, toutes les clauses de $ ou de l’expression doivent être supscopes par des index.”

Ajoutez donc des index pour vos autres champs et cela fonctionnera. J’ai eu un problème similaire et cela l’a résolu.

Vous pouvez en lire plus ici: https://docs.mongodb.com/manual/reference/operator/query/or/