You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB报reactionID_1唯一索引重复键错误但字段值不重复问题

问题根因

核心错误是唯一索引的字段名大小写配置错误,和实际存储的字段名不匹配:

  1. 你的C#模型里定义的字段是小驼峰格式的reactionId(末尾的d为小写),插入的所有文档实际存储的字段名也是reactionId。
  2. 你创建的唯一索引名为reactionID_1,按照MongoDB默认索引命名规则(字段名_排序方向),说明建索引时指定的字段是大写D的reactionID,和实际存储字段名不一致。
  3. MongoDB 4.0版本的唯一索引规则:如果文档不存在被索引的字段,索引会为该文档生成一个值为null的索引条目,且唯一索引全局仅允许存在一个null值条目。
  4. 批量写入时,第一个文档因为不存在reactionID字段,索引写入null条目后插入成功;第二个文档同样不存在reactionID字段,尝试写入第二个null索引条目时直接触发11000重复键错误,和你看到的报错信息dup key: { : null }完全吻合。

你贴出的索引定义缺少核心的key字段配置段,也侧面印证了索引创建时字段配置有误。另外你的实体类id字段加了[BsonIgnoreIfNull]特性,新对象id为null时序列化会自动忽略该字段,由MongoDB生成默认ObjectId,这部分逻辑没有问题,不是报错诱因。

修复步骤
  • 先删除错误创建的索引,在Mongo Shell中执行以下命令:
db.Reactions.dropIndex("reactionID_1")
  • 清理集合中的脏数据:检查所有存量文档,确保不存在缺失reactionId字段、或reactionId值为null的文档,且所有文档的reactionId值唯一,避免后续创建索引失败。
  • 在正确的字段上重新创建唯一索引,严格匹配实际存储的字段名大小写:
db.Reactions.createIndex(
  { reactionId: 1 },
  { unique: true, background: true }
)
  • 重新执行你的批量upsert代码即可正常写入。如果是大批量写入场景,可以给BulkWrite传入配置关闭有序执行,提升写入性能,示例如下:
await _reactions.BulkWriteAsync(bulk, new BulkWriteOptions { IsOrdered = false });

内容的提问来源于stack exchange,提问作者Marco Rebsamen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:24:12