Mongodb 如何检查数据库中是否已经存在字段?

Mongodb 如何检查数据库中是否已经存在字段?,mongodb,validation,mongoose,Mongodb,Validation,Mongoose,我的问题是检查数据库中是否已经存在员工的姓名或电子邮件。他们说在预更新中间件中这样做很好。我试过了,但不起作用 我将(id_of_staff、updatedStaff_info和callback_函数)传递给update函数 以下是我的更新功能: module.exports.updateStaff = function(id, updatedStaff, callback){ var query = {_id: id}; Staff.update(query, updatedStaf

我的问题是检查数据库中是否已经存在员工的姓名或电子邮件。他们说在预更新中间件中这样做很好。我试过了,但不起作用

我将(id_of_staff、updatedStaff_info和callback_函数)传递给update函数

以下是我的更新功能:

module.exports.updateStaff = function(id, updatedStaff, callback){
var query = {_id: id};

    Staff.update(query, updatedStaff, callback);
}

每次调用Staff.update()时,都会执行预更新中间件。我想在这里检查的是,如果他们已经存在的名称或电子邮件。问题是,更新前中间件中的名称和电子邮件似乎未定义

我的预更新中间件:

staffSchema.pre("update", function(next){

 var staff = this;
 Staff.find({_id:{$ne: staff.id},  $or:[{name: staff.name}, {email: staff.email}]}, function (err, docs) {

    if (!docs.length){
        next();
    }else{                
        next(new Error("Name or email already exist"));
    }
});
}))


我得到的结果总是“姓名或电子邮件已经存在”。我试图在控制台日志中打印staff.name的值,但它说它未定义。我做得对吗?你能帮我把它修好吗。非常感谢各位。

我找到了问题的解决方案。我没有使用预更新中间件,而是创建了一个函数来检查名称或电子邮件是否已经存在

代码如下:

module.exports.updateStaff = function(id, updatedStaff, callback){
var query = {_id: id};

//check name and email if already available
function updateStaff(id, updatedStaff, callback){
    //get staff that has the same name or email
    Staff.find({_id:{$ne:id},  $or:[{name: updatedStaff.name}, {email_pc: updatedStaff.email_pc}]}).exec(
        function(err, result){
            console.log(result);
            if(!err){
                if(result.length){                                 
                    console.log("Name or email already exist.");
                    callback("Conflict", null);
                }
                else{
                    //udpate the staff
                    Staff.update(query, updatedStaff, callback);
                }
            }else{
                callback(err);
            }

        })
}

updateStaff(id, updatedStaff, callback);
}


但我仍然愿意使用预更新中间件来回答这个问题。谢谢:)

请给你的问题一个更好的标题,一个描述问题的标题。你的问题标题应该描述你遇到的问题或你提出的问题。你是猫鼬的新手这一事实是无关紧要的,而且问你是否能得到帮助显然是毫无意义的;这就是这个网站存在的全部目的。你的标题应该清楚地描述这个问题,使其在搜索结果中对未来的读者有意义。也不要在问题标题中使用标签名。这就是标签的用途。然而,这个问题缺乏关于您作为参数发送的内容以及您实际期望的内容是否匹配的详细信息。最可能的原因是给定的条件总是与数据中的某些内容相匹配。由你来证明你认为不应该这样做。哦,很抱歉。我确保下次做对。
结果。长度不正确,因为
0
实际上是
true
。正确的行应该是
if(result.length>0)
,或者更有效地在查询中包含
.limit(1)
,这样就不会不必要地要求数据库返回比第一个找到的结果更多的结果。