160 votes

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

Récemment, j'ai commencé à utiliser MongoDB avec Mongoose sur Nodejs.

Lorsque j'utilise la méthode Model.find avec $or état et _id champ, 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.

286voto

Younghan Points 4009

Je l'ai résolu en google :

 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);
});

91voto

Govind Rai Points 3726

J'implore tout le monde d'utiliser le langage de création de requêtes de Mongoose et les promesses 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 .

0voto

Farasi78 Points 571

Selon la documentation de mongoDB : "... Autrement dit, pour que MongoDB utilise des index pour évaluer une expression $or, toutes les clauses de l'expression $or doivent être prises en charge 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 savoir plus ici : https://docs.mongodb.com/manual/reference/operator/query/or/

-1voto

Firez Points 53
async() => {
let body = await model.find().or([
  { name: 'something'},
  { nickname: 'somethang'}
]).exec();
console.log(body);
}
/* Gives an array of the searched query!
returns [] if not found */

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X