具有$ or条件的猫鼬的find方法无法正常工作


116

最近,我开始在Node.js上使用MongoDB和Mongoose。

当我将Model.find方法与$or条件和_id字段一起使用时,猫鼬无法正常工作。

这不起作用:

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中,两者都可以正常工作。

Answers:


211

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

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

2
您能用文字描述这种解决方案的原因吗?谢谢
Alexander Mills

这看起来像是针对特定问题的解决方案。您可能需要继续搜索。
Kesarion '16

您能提供参考吗?为什么在这种情况下,param必须包含超过12个字符?这是特定于您的问题还是ObjectId()的要求?如果我的参数没有12个字符怎么办?谢谢!
yusong '16

6
您还可以按以下方式检查ObjectId:const mongoose = require('mongoose'); mongoose.Types.ObjectId.isValid(objectidtocheck)
Orhan

@yusong是由于猫鼬会导致错误,如果它不是有效的ObjectId。我上面提到的一种更清洁的方法。
Haydar Ali Ismail

53

我恳请所有人使用Mongoose的查询生成器语言并承诺而不是回调:

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

阅读有关猫鼬查询的更多信息。


爱它!感谢您的注意!
zeckdude

0

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

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

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


1
这是一个错误的陈述-如果需要使用索引,则仅需要索引-例如,为了提高性能,避免进行集合扫描。但是,如果性能是不是一个问题(如集合是相当小),那么就无所谓..
安迪·洛伦茨

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 */

1
您的答案与Govind Rai的答案有何不同?是什么使您的人比他们的人优越?
BDL

异步/等待,没有什么可以使它更出色?
Firez

2
在此网站上,通常仅提供代码答案。您能否编辑您的答案以包含一些对代码的注释或解释?解释应回答以下问题:它是做什么的?它是如何做到的?去哪儿了?它如何解决OP的问题?请参阅:如何anwser。谢谢!
Eduardo Baitello
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.