使用$或condition的Mongoose的find方法无法正常工作

时间:2011-09-12 00:12:44

标签: mongodb node.js mongoose

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

当我使用带有$or条件和_id字段的Model.find方法时,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中,两者都能正常工作。

4 个答案:

答案 0 :(得分:161)

我通过谷歌搜索解决了这个问题:

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);
});

答案 1 :(得分:22)

我恳请大家使用Mongoose的查询构建器语言和承诺而不是回调:

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

详细了解Mongoose Queries

答案 2 :(得分:0)

根据mongoDB文档:“......也就是说,对于MongoDB使用索引来计算$或表达式,$或表达式中的所有子句必须由索引支持。”

因此,为其他字段添加索引,它将起作用。我有类似的问题,这解决了它。

您可以在此处阅读更多内容:https://docs.mongodb.com/manual/reference/operator/query/or/

答案 3 :(得分:0)

async() => {
let body = await model.find().or([
  { name: 'something'},
  { nickname: 'somethang'}
]).exec();
console.log(body);
}
/* Gives an array of the searched query!
returns [] if not found */