2011-09-12 12 views
66

Recientemente comencé a usar MongoDB con Mongoose en Nodejs.

Cuando uso el método Model.find con la condición $or y el campo _id, Mongoose no funciona correctamente.

Esto no funciona:

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

Por cierto, si quito la parte '_id', esto funciona!

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

Y en el shell MongoDB, ambos funcionan correctamente.

Respuesta

132

Lo resuelto a través de 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); 
}); 
+13

Puede marcarlo como la respuesta a su pregunta. – fernandopasik

+0

¿Puedes describir por qué esta solución funciona con palabras? gracias –

+0

no funciona para mí – OMGPOP

0

Según la documentación MongoDB:" ... Es decir, para MongoDB utilizar índices para evaluar un $ o expresión, todas las cláusulas de la expresión debe $ o ser apoyado por los índices ".

Así que agrega índices para tus otros campos y funcionará. Tuve un problema similar y esto lo resolvió.

Usted puede leer más información aquí: https://docs.mongodb.com/manual/reference/operator/query/or/

1

imploro a todos a utilizar el lenguaje generador de consultas de la mangosta y promesas en lugar de devoluciones de llamada:

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

Leer más sobre Mongoose Queries.

Cuestiones relacionadas