【问题标题】:Mongoose's find method with $or condition does not work properlyMongoose 的 $or 条件的 find 方法无法正常工作
【发布时间】:2011-11-14 23:34:24
【问题描述】:

最近我开始在 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 中,两者都可以正常工作。

【问题讨论】:

    标签: mongodb node.js mongoose


    【解决方案1】:

    我通过谷歌搜索解决了:

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

    【讨论】:

    • 您能描述一下为什么这个解决方案可以使用文字吗?谢谢
    • 这看起来像是解决一个相当具体的问题。您可能需要继续搜索。
    • 您能提供您的参考吗?为什么在这种情况下参数必须包含超过 12 个字符?这是特定于您的问题还是 ObjectId() 的要求?如果我的参数没有 12 个字符怎么办?谢谢!
    • 您也可以查看 ObjectId 如下:const mongoose = require('mongoose'); mongoose.Types.ObjectId.isValid(objectidtocheck)
    • @yusong 如果不是有效的 ObjectId,mongoose 会抛出错误。我上面提到的一种更清洁的方法。
    【解决方案2】:

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

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

    阅读更多关于Mongoose Queries的信息。

    【讨论】:

    • 爱它!感谢您的提醒!
    【解决方案3】:

    您还可以添加$orand 的组合,为您的函数提供更多的灵活性、选项和稳健性,如下所示:

    var ObjectId = require("mongoose").Types.ObjectId;
    var idParam = new ObjectId(param.length < 12 ? "123456789012" : param);
    const {nameParam, nicknameParam, ageParam} = req.params || req.body || req.query
    
    User.find({
            $or: [{
                    _id: objId
                },
                {
                    name: nameParam
                },
                {
                    nickname: nicknameParam
                }
            ],
            $and: [{
                age: ageParam
            }]
        },
        function (err, docs) {
            if (!err) res.send(docs);
        }
    );

    所以这意味着您的 find() 将查找所有满足 (_id = idParam OR name = nameParam ORnickname =nicknameParam) AND (age = ageParam) 的用户

    我希望这对那里的人有所帮助。 干杯!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-26
      • 2021-06-15
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      相关资源
      最近更新 更多