首页/数据/NoSQL 速查/upsert 不存在则插入
本包目录(322 条)
MongoDB99 条
Elasticsearch89 条ClickHouse56 条时序与列式28 条选型与架构50 条

upsert 不存在则插入

updateOne/updateMany 传 {upsert:true}:无匹配文档时按“过滤条件 + 更新内容”新建;$setOnInsert 只在插入分支生效。

NoSQL 速查数据更新于 2026-10-12
选项{ upsert: true }
仅插入时生效$setOnInsert
返回upsertedId 标识新建文档

计数场景

计数场景
db.counters.updateOne(
  { name: "orderNo" },
  { $inc: { value: 1 }, $setOnInsert: { createdAt: new Date() } },
  { upsert: true }
)
更新操作符在插入分支同样会被应用,新建文档是过滤条件与更新内容的合并结果。

易错点

  • 无唯一索引保护时并发 upsert 可能插入多条重复文档,计数类业务键必须建唯一索引
  • upsert 新建时若与已有唯一索引值冲突,会抛 E11000,客户端应捕获并重试

数据来源与参考

  • MongoDB Manual: upsert
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌