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

时间:2018-04-03 16:02:12

标签: node.js express mongoose

在以下方法中,我正在尝试使用我提供的电子邮件地址搜索文档。如果文档存在,我想更新_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 个答案:

答案 0 :(得分:0)

您可以使用upsert : true尝试此操作。如果找不到,将创建文档

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

    // do something with the document
  });

PS。您无需执行newUser.save(..)。如果没找到,那就会为你做到这一点。 但我不知道你为什么要更新id,因为这会造成致命的后果