✅ 实现"不存在就插入,存在则更新"
🎯 快速回答
场景 1:插入和更新使用相同数据(最常见)⭐
如果插入和更新时数据完全一样,只需要 $set:
说明:
- ✅ 不存在时:创建新文档,包含
$set中的所有字段 - ✅ 存在时:更新现有文档,只修改
$set中的字段 - ✅ 这是最常用的方式,简单直接
场景 2:插入和更新使用不同数据
如果需要在插入时设置一些额外的字段(如 createdAt),使用 $setOnInsert:
说明:
- ✅ 不存在时:创建新文档,包含
$set+$setOnInsert的所有字段 - ✅ 存在时:只更新
$set中的字段,不会修改$setOnInsert的字段
📊 两种场景对比
选择建议:
- ✅ 大多数情况用场景 1(只用
$set) - ✅ 只有需要区分"插入时的字段"和"更新时的字段"才用场景 2
📋 完整示例
示例 1:相同数据 - 商品信息更新 ⭐
示例 2:相同数据 - 用户状态更新
示例 3:不同数据 - 用户配置管理
示例 3:不同数据 - 用户配置管理
示例 4:统计数据 - 计数器
🔍 判断是否为新插入
📚 其他支持 Upsert 的方法
updateOne() 示例
如果不需要返回文档内容,可以使用 updateOne()(性能更好):
⚠️ 重要注意事项
1. 必须使用更新操作符
2. $setOnInsert 只在插入时生效
📖 详细文档
- Upsert 操作完整指南 - 包含所有场景和最佳实践
- findOneAndUpdate() 文档 - 详细 API 说明
- updateOne() 文档 - 简单场景的替代方案
日期: 2026-01-28
版本: v1.1.2