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