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 findOneAndUpdate() 仅在文档已存在时更新,如果不存在则不创建新文档?
如果未找到 ID,则 Mongoose 更新文档或插入新文档(Express REST API)
如果未找到 ID,则 Mongoose 更新文档或插入新文档(Express REST API)