2011-09-12 76 views
66

最近我開始在Nodejs上使用MongoDB和Mongoose。

當我使用Model.find方法$or條件和_id字段時,Mongoose無法正常工作。

這不起作用:

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

順便說一句,如果我刪除了 '_id' 的一部分,這樣沒有問題!

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

而在MongoDB shell中,兩者都正常工作。

回答

132

我解決它通過谷歌搜索:

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

您可以將其標記爲您的問題的答案。 – fernandopasik

+0

你能描述一下爲什麼這個解決方案適用於單詞嗎?謝謝 –

+0

對我不起作用 – OMGPOP

0

據MongoDB的文檔:」 ......也就是說,MongoDB的使用索引來評估一個$或表達式,在$或表達式必須所有條款得到索引的支持。「

因此,爲您的其他領域添加索引,它將工作。我有類似的問題,這解決了它。

你可以在這裏閱讀更多:https://docs.mongodb.com/manual/reference/operator/query/or/

1

我懇求大家用貓鼬的查詢構建器的語言和承諾,而不是回調:

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

瞭解更多關於Mongoose Queries