【问题标题】:findOneAndUpdate with Upsert always inserting a new user带有 Upsert 的 findOneAndUpdate 总是插入一个新用户
【发布时间】:2018-08-14 19:52:49
【问题描述】:

我想做的是更新一条记录,如果它不存在于猫鼬中,则将其插入。这是我的代码:

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){
    ...
}

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

我不确定我是否错误地执行了更新。我用同样的方法试过了,但是更新了,它也不起作用。

你能帮帮我吗?谢谢!

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

你需要在没有 exec 的情况下放置 return:

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){
    ...
}

仅供参考: 默认是返回未更改的文档。如果您希望返回新的、更新的文档,您必须传递一个附加参数:{new:true} 和 upsert 选项。

【讨论】:

    【解决方案2】:

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

    module.exports.upsertUser = 功能(用户){ 变量选项 = Users.findOneAndUpdate({email: user.email}, {$set:{ 用户名:'里卡多' }},{ returnOriginal: true}).exec(); };

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

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 2013-06-19
      • 2013-02-23
      • 2016-11-21
      相关资源
      最近更新 更多