【问题标题】:Adding data to database only when it is not already present (Node js)仅当数据不存在时才将数据添加到数据库(Node js)
【发布时间】:2017-05-08 18:09:15
【问题描述】:

我正在尝试将新数据添加到数据库中,只有当它不存在时。我要求用户输入名称,如果名称已经存在,他/她不能输入相应的数据,并且会出错显示它“已经存在”。 这就是我正在做的-

app.post("/new",function(req,res){
    Model.find({"name":req.body.name},function(err,persons){
         if(err!=null)
            { req.flash("error","Already Exists");
              res.redirect("/new");}
         if(err==null)
            { Model.create(req.body.person,function(err,newPerson){
                    if(err){console.log("Error");}
                    else{
                    newPerson.name=req.user.name;
                    newPerson.id=req.user._id;
                    newPerson.save();
                    res.redirect("/");}

            });}
    });

});

但是当我使用这个时,即使我输入了已经存在的数据,它仍然会将它添加到数据库中。 我正在使用 express、node js 和 mongodb

【问题讨论】:

  • Model.find没有找到文档时,err会被设置吗?这听起来有点违反直觉。你确定这是真的吗?
  • 我认为这是正确的@mingos

标签: javascript node.js mongodb express


【解决方案1】:
Model.findOne({"name":req.body.name},function(err,person){
    if(err){
        //err found
        res.send(err)
    }
    else if(person){
        // no error and also person exists
        req.flash("error","Already Exists");
        res.redirect("/new");
    }
    else{
        // no error and and person not found so create new one
        let newPerson = new Model({
            name : req.body.name,
            otherParams : req.body.otherParams 
        });
        newPerson.save(function(err){
            if(err){
                res.send('could not create new person');
            }
            else{
                res.send('person created successfully');

            }
        });
    }

});

【讨论】:

【解决方案2】:

您为什么不尝试使用 mongo 架构字段,例如,

name: {
     // other rules
     unique: true 
},

在新创建时,如果已经存在,它将在回调中生成error对象。

这也将减少您的find 数据库调用。

【讨论】:

  • @Harish 请在您的答案中包含更多代码,以便 Ravi 能够理解...
  • 我确实检查过了,我只需要在模式中添加唯一规则,对吗?这就是我所做的,但它没有工作@Jonasw
  • @RaviHooda 你只需要 Model.create() 调用,然后在出错时显示 已经存在 ...
【解决方案3】:

添加选项对象(http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate

Model.findOne({"name":req.body.name}, {upsert:true},function(err,persons){
     if(err!=null)
        { req.flash("error","Already Exists");
          res.redirect("/new");}

});

【讨论】:

  • 抱歉没有检查您的回电。您的错误为空,除非他找到一行,否则不会发生大的数据库错误。所以只需删除你的 if(err==null) 我更新了我的答案
  • 对不起,它仍然将数据添加到数据库中,没有任何错误
  • 您要我只删除创建部分吗?这有什么帮助?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 2017-04-21
  • 2022-06-10
相关资源
最近更新 更多