2011-09-12 44 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