Mongoose:过滤,如果存在则更新文档,否则创建它

Posted

技术标签:

【中文标题】Mongoose:过滤,如果存在则更新文档,否则创建它【英文标题】:Mongoose : filter then update document if it exists , otherwise create it 【发布时间】:2018-09-13 00:57:36 【问题描述】:

在以下方法中,我正在尝试使用我提供的电子邮件地址搜索文档。如果文档存在,我想更新 _id 字段,否则我创建一个全新的文档。

function (accessToken, refreshToken, profile, done) 

    var newUser = new User();

    newUser.name = profile.displayName;
    newUser.email = profile.emails[0].value.toString();

    options =  upsert: true, new: true, setDefaultsOnInsert: true ;
    update =  '_id': newUser._id ;

    User.findOneAndUpdate( 'email': profile.emails[0].value.toString() , update, options, function (err, user) 
        newUser.save(function (err) 
            if (err)
                throw err;
            newUser.token = newUser.generateJwt();
        );
    );
    return done(null, newUser);

我在控制台中收到以下错误:

events.js:183 投掷者; // 未处理的“错误”事件 ^ BulkWriteError: E11000 重复键错误索引:databasename.users.$id dup key

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您可以使用upsert : true 进行尝试。如果找不到,这将创建文档

  User.findOneAndUpdate(query, update, options, function(error, result) 
   if (error) return;

    // do something with the document
  );

ps。你不需要做newUser.save(..)。如果没有找到,它会为你做到这一点。 但我不知道你为什么要更新id,因为这会导致致命的后果

【讨论】:

以上是关于Mongoose:过滤,如果存在则更新文档,否则创建它的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 如果存在更新则获取集合数据,否则插入

Mongoose findOneAndUpdate() 仅在文档​​已存在时更新,如果不存在则不创建新文档?

如果未找到 ID,则 Mongoose 更新文档或插入新文档(Express REST API)

如果未找到 ID,则 Mongoose 更新文档或插入新文档(Express REST API)

Mongoose:如果值存在于对象数组中的数组中,则过滤数据

如果未找到值,则使用 mongoose 将对象添加到数组中,否则更新字段