2011-09-12 7 views
66

Récemment, j'ai commencé à 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); 
}); 

D'ailleurs, si je retire 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.

Répondre

132

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

Vous pouvez le marquer comme la réponse à votre question. – fernandopasik

+0

pouvez-vous décrire pourquoi cette solution fonctionne avec des mots? merci –

+0

ne fonctionne pas pour moi – OMGPOP

0

Selon la documentation MongoDB: » ... C'est, pour MongoDB d'utiliser des index pour évaluer un $ ou une expression, toutes les clauses de l'$ ou l'expression doit être pris en charge par les index. " Donc, 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/

1

Je supplie tout le monde à utiliser la langue de générateur de requêtes de mangouste et de promesses au lieu de callbacks:

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

En savoir plus sur Mongoose Queries.

Questions connexes