MongoDB技术需求:查询指定邮箱文档,不存在则创建并返回
解决方案
你要的需求完全可以用findOneAndUpdate()实现,核心是调整参数配置:
- 用
$setOnInsert保证只有创建新文档时才写入data字段,已存在的文档不会被修改 - 加上
returnDocument: 'after'参数(MongoDB 4.2及以上版本支持),就能返回最终的文档:新创建的就返回新文档,已存在的就返回原文档
正确代码示例:
.findOneAndUpdate( { email: email }, { $setOnInsert: { data: data } }, { upsert: true, returnDocument: 'after' // 指定返回操作完成后的文档 } );
关键参数说明
upsert: true:当查询不到匹配文档时自动创建新文档$setOnInsert:仅在upsert触发创建操作时执行更新,已存在的文档不会有任何改动returnDocument: 'after':返回操作后的最终文档——新创建的就返回新文档,已存在的就返回原文档(默认是before,此时创建新文档会返回null,不符合需求)
你之前的误区
你误以为findOneAndUpdate()会覆盖已存在的文档,但实际上因为用了$setOnInsert,已存在的文档根本不会被修改。问题出在你没加returnDocument: 'after',导致创建新文档时返回的是null,而非新文档。
关于updateOne()的补充
updateOne()确实无法返回操作后的文档,所以要同时实现“创建/查询+返回文档”,findOneAndUpdate()是最优选择。
内容的提问来源于stack exchange,提问作者Keaton Benning
相关产品推荐
相关产品推荐

