web-dev-qa-db-fra.com

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 la condition $or et le champ _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);
});

À propos, si je supprime la partie '_id', ça marche!

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

Et dans MongoDB Shell, les deux fonctionnent correctement.

77
Younghan

Je l'ai résolu par googler:

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

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

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

En savoir plus sur Mongoose Queries .

16
Govind Rai

Selon la documentation de mongoDB: "... C'est-à-dire que pour que MongoDB utilise des index pour évaluer une $ ou une expression, toutes les clauses de la $ ou de l'expression doivent être prises en charge par des index." 

Alors ajoutez 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/

0
Farasi78