【问题标题】:How do I check if a field already exists in the database?如何检查数据库中是否已存在字段?
【发布时间】:2017-11-22 09:52:41
【问题描述】:

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

我将(id_of_staff、updatedStaff_info 和 callback_function)传递给更新函数。

这是我的更新功能:

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 的值,但它说它未定义。我做对了吗?你能帮我让它工作吗?非常感谢你们。

【问题讨论】:

  • 请给你的问题一个更好的标题,一个描述问题的标题。
  • 您的问题标题应该描述您遇到的问题或您提出的问题。您是 Mongoose 的新手这一事实是无关紧要的,显然询问您是否可以得到帮助是没有意义的;这就是本网站存在的全部目的。您的标题应清楚地描述问题,使其对搜索结果中的未来读者有意义。
  • 也不要在问题标题中使用标签名称。这就是标签的用途。然而,这个问题缺乏关于您作为参数发送的内容以及您实际期望的内容是否应该匹配的详细信息。最可能的原因是给定的条件将始终与您的数据中的某些内容相匹配。由你来表明你认为它不应该。见How to create a Minimal, Complete, and Verifiable example
  • 哦,对不起。我确保下次做对。

标签: mongodb validation mongoose


【解决方案1】:

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

代码如下:

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

}

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

【讨论】:

  • result.length 不正确,因为0 实际上是true。您的正确行应该是 if ( result.length > 0 ) 或者甚至更有效地在您的查询中包含 .limit(1),这样您就不会不必要地要求数据库返回比找到的第一个结果更多的结果。
猜你喜欢
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多