2011-09-12 18 views
66

Niedawno zacząłem używać MongoDB z Mongoose na Nodejs.

Gdy używam metody Model.find z polem $or i _id, Mongoose nie działa poprawnie.

To nie działa:

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

Nawiasem mówiąc, jeśli usunąć '_id' część, to działa!

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

W powłoce MongoDB oba działają poprawnie.

Odpowiedz

132

Rozwiązałem to przez googlowania:

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

Możesz oznaczyć go jako odpowiedź na swoje pytanie. – fernandopasik

+0

Czy możesz opisać, dlaczego to rozwiązanie działa ze słowami? dzięki –

+0

nie działa dla mnie – OMGPOP

0

Według dokumentacji MongoDB:”... Oznacza to, że dla MongoDB używać indeksów ocenić $ lub wyrażenie, wszystkie klauzule w $ lub wyrażenie musi wspierane przez indeksy. "

Dodaj więc indeksy dla innych pól i to zadziała. Miałem podobny problem i to rozwiązało.

można przeczytać więcej tutaj: https://docs.mongodb.com/manual/reference/operator/query/or/

1

błagam wszystkich, aby używać języka kwerend Mongoose i obiecuje zamiast wywołania zwrotne:

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

Więcej o Mongoose Queries.

Powiązane problemy