.find()即使数据存在也不返回任何内容

时间:2019-01-29 12:04:42

标签: mongodb mongoose

我有一个mongo数据库,其中包含3个集合,分别用于User,Partner,Admin等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。我找不到问题。有人知道为什么会这样吗? 预先感谢。

2 个答案:

答案 0 :(得分:0)

您查询中的

class FirstViewController: UIViewController, DataEnteredDelegate { ... } 将搜索名为attr:的数据库字段。如果要使用功能参数attr,请使用attr作为键。

示例:

[attr]:

此功能自ES6起可用,因此应该可以正常工作。有关更多信息,请参见文档here

答案 1 :(得分:0)

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

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

{ [attr]: val }

此外,该函数可以使用异步/等待模式来提高可读性,并用于查找文档是否存在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)
    }
};