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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带Upsert的findOneAndUpdate总是插入一个新用户相关的知识,希望对你有一定的参考价值。

我想要做的是更新记录并插入它,如果它不存在与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){
    ...
}

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

我不确定我是否错误地执行了更新。我已经尝试过相同的方式,但有更新,它也无法正常工作。

你能帮助我吗?谢谢!

答案

你需要在没有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}。

另一答案

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

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

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

以上是关于带Upsert的findOneAndUpdate总是插入一个新用户的主要内容,如果未能解决你的问题,请参考以下文章

(mongoose/promises) 如何检查文档是不是是使用 findOneAndUpdate 和 upsert 创建的

猫鼬 findOneAndUpdate Upsert _id null?

findOneAndUpdate的用法详解

猫鼬 findOneAndUpdate 和 runValidators 不工作

猫鼬 findOneAndUpdate 和 runValidators 不工作

MongoDB - Mongoose 查询 findOneAndUpdate() 不更新/复制数据库