【问题标题】:.find() returning nothing even when data exists.find() 即使数据存在也不返回
【发布时间】:2019-06-22 13:23:35
【问题描述】:

我有一个 mongo 数据库,其中包含 3 个集合,用于 3 种不同类型的用户,即用户、合作伙伴、管理员。每当有任何类型的新用户注册时,我都会搜索所有三个集合以检查用户名和电子邮件是否已经存在。我试图通过调用一个函数来实现这一点:

function checkAttribute(attr,val,callback){
    User.find({attr: val},function(err,user){
        if(err){
            console.log(err);
        }else{
            if(user.length === 0){
                    Partner.find({attr: val},function(err,partner){
                    if(err){
                        console.log(err);
                    }else{
                        if(partner.length === 0){
                            Admin.find({attr: val},function(err,admin){
                                if(err){
                                    console.log(err);
                                }else{
                                    if(admin.length === 0){
                                        return callback(null,true);
                                    }else{
                                        return callback(null,false);
                                    } 
                                }
                            });
                        }else{
                            return callback(null,false);
                        }
                    }
                });
            }else{
                return callback(null,false);
            }
        }
    });
};

调用函数行:

checkAttribute("username",newUser.username,function(error,response){
.......
});

但这不起作用,因为即使已经存在传递的用户名/电子邮件的用户,它也总是返回 true。我无法找到问题所在。有谁知道为什么会这样? 提前致谢。

【问题讨论】:

  • 尝试使用 count() 查询
  • 为什么你用返回回调(null,false)返回回调?即使你找到了用户。
  • @chirag.sweng 因为如果找到具有给定用户名或电子邮件的用户,则我无法添加具有相同值的新用户,因此返回 false 表示我无法添加注册用户。

标签: mongodb mongoose


【解决方案1】:

由于您在函数参数中将属性作为变量传递,因此查询文档 { attr: val } 是一个带有“attr”键的对象,而不是你传入的动态属性。

要解决此问题,您需要在查询对象中使用computed property names

{ [attr]: val }

此外,该函数可以使用 async/await 模式以提高可读性,并用于查找文档是否存在 findOne 这样做 以及如果它存在则返回一个文档,否则返回null。

所以你的函数可以重构为

async function checkAttribute(attr, val, callback) {
    try {
        const query = { [attr]: val }
        const user = await User.findOne(query).exec()
        const partner = await Partner.findOne(query).exec()
        const admin = await Admin.findOne(query).exec()

        const found = (user || partner || admin) ? true: false
        return callback(null, found)
    } catch (err) {
        console.error(err)
        return callback(err, null)
    }
};

【讨论】:

    【解决方案2】:

    attr: 在您的查询中将搜索名为attr 的数据库字段。如果要使用函数参数attr,请使用[attr]:作为key。

    示例:

     attr = 'username'
     User.find({ [attr]: val }, function (err, user) {
        if (err) {
            console.log(err);
        }
     })
    

    这是自 ES6 以来可用的功能,因此应该可以正常工作。请参阅文档here 了解更多信息

    【讨论】:

      猜你喜欢
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多