如果MongoDB

时间:2018-02-16 16:34:33

标签: node.js mongodb

首先,我想首先说我知道其他几个帖子与插入/更新如果不存在有些相关。但是,我的情况有点不同,并不适合其他帖子。

如果用户名或电子邮件不存在,我尝试插入新文档。

我的代码工作正常,唯一的问题是我的架构不是井井有条。我希望username之前显示email

问题

enter image description here

我已经尝试解决此问题并且我没有成功,但问题恰好出现在$or查询运算符中,我不知道为什么它会更改我的架构! !

这是我的代码

   //My Schema
   let newUserObject = {
    username: body.username,
    email: body.email,
    password: body.password
  };

 //upsert: true => create doc if username or email doesn't exists
 db.collection('users').updateOne( 
   {$or:[{username:newUserObject.username},{email:newUserObject.email}]},
  { $setOnInsert: newUserObject },
  { upsert: true }, function(err, res) {

    let response = { sucess: true, msg: "The User Created Successfully"};

    if(err){
        response.sucess=false;
        response.status=500;
        response.msg="There was a problem registering the user.";
    }else if(!res.result.upserted)
      response.msg="The User/Email is Already Exists";

    callback(response);
    client.close();
  });

非常感谢任何信息,谢谢

2 个答案:

答案 0 :(得分:0)

为了保持我的文档有条理,首先我用findOne()方法调用insertOne方法后,找到符合我的条件的文档:

db.collection('users').findOne({$or:[{username:newUserObject.username},{email:newUserObject.email}]},
      function(err, doc){
        assert.equal(err, null);

        let response = { sucess: true, msg: "The User Created Successfully"};

        //The User doesn't exist => Add New User
       if(!doc){
          db.collection('users').insertOne(newUserObject, function(err, res){
            if(err){
                response.sucess=false;
                response.status=500;
                response.msg="There was a problem registering the user.";
            } 
            callback(response);
            client.close();
          });
       }
       else{
               response.msg="The User/Email is Already Exists";
                callback(response);
                client.close();
       }
     });

结果

enter image description here

我不确定我的代码是否干净且遵循良好做法,但现在这是一个很好的解决方案。

答案 1 :(得分:0)

  

在其他情况下,请仅更新!res.upserted