2011-09-12 31 views
66

Gần đây tôi bắt đầu sử dụng MongoDB với Mongoose trên Nodejs.

Khi tôi sử dụng phương pháp Model.find với điều kiện $or và trường _id, Mongoose không hoạt động bình thường.

này không hoạt động:

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

Bằng cách này, nếu tôi loại bỏ các phần '_id', điều này không làm việc!

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

Và trong MongoDB shell, cả hai đều hoạt động bình thường.

Trả lời

132

Tôi giải quyết nó thông qua googling:

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

Bạn có thể đánh dấu nó làm câu trả lời cho câu hỏi của mình. – fernandopasik

+0

bạn có thể mô tả lý do giải pháp này hoạt động với các từ không? cảm ơn –

+0

không hoạt động cho tôi – OMGPOP

0

Theo tài liệu MongoDB:" ... Đó là, cho MongoDB sử dụng các chỉ số để đánh giá một $ hoặc biểu hiện, tất cả các điều khoản trong $ hoặc biểu phải được hỗ trợ bởi các chỉ mục. "

Vì vậy, hãy thêm chỉ mục cho các trường khác của bạn và nó sẽ hoạt động. Tôi đã có một vấn đề tương tự và điều này giải quyết nó.

Bạn có thể đọc thêm ở đây: https://docs.mongodb.com/manual/reference/operator/query/or/

1

Tôi cầu xin tất cả mọi người sử dụng ngôn ngữ xây dựng truy vấn Mongoose và hứa hẹn thay vì callbacks:

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

Đọc về nhiều Mongoose Queries.

Các vấn đề liên quan