带有Upsert的findOneAndUpdate总是插入一个新用户

时间:2018-08-14 19:52:49

标签: node.js mongodb mongoose

我想做的就是更新一条记录,如果猫鼬不存在,请插入一条记录。这是我的代码:

module.exports.upsertUser = function(user) {
    var options = {userName : 'Ricardo'}
    Users.findOneAndUpdate({email: user.email}, options, {upsert:true}).exec();
}

并且:

var promise = Users.upsertUser(user);
promise
.then(function(results){
    ...
}
.catch(function(err){
    ...
}

执行承诺时,每次使用相同的电子邮件创建一个新用户。

我不确定是否执行错误更新。我已经用相同的方法尝试过,但是使用了更新,它也不起作用。

你能帮我吗?谢谢!

2 个答案:

答案 0 :(得分:0)

根据您的编码,findOneAndUpdate()的作用是找到要编辑的该文档/用户文档,在这种情况下,您用来搜索要编辑的该用户文档的文档是和他的电子邮件。现在,您的第二个参数修改了您想要修改的文档部分,但是此选项必须附加在一些mongodb运算符上(请访问此链接以获取它们的列表:https://docs.mongodb.com/manual/reference/operator/update/),但在您情况下您需要的是 $ set 运算符。因此,我将像这样修改您的代码:

module.exports.upsertUser =函数(用户){     var options =     Users.findOneAndUpdate({email:user.email},{$ set:{       userName:“里卡多”     }},{      returnOriginal:true})。exec(); };

所以尝试上面的修改,让我们看看它是如何工作的

答案 1 :(得分:0)

您需要在没有exec的情况下放回退单:

module.exports.upsertUser = function(user) {
    var options = {userName : 'Ricardo'}
    return Users.findOneAndUpdate({email: user.email}, options, {upsert:true, new: true});
}


var promise = Users.upsertUser(user);
promise.then(function(results){
   if(results) {
      console.log(results);
   } else {
      console.log('!results');
   }
}.catch(function(err){
    ...
}

仅供参考: 默认为返回未更改的文档。如果要返回新的,更新的文档,则必须传递一个带有upsert选项的附加参数:{new:true}。