← 中文资源

简体中文版本

MongoDB 插入报 E11000 重复键错误

通过找出唯一索引并使用 upsert 或幂等写入,解决 MongoDB 的 E11000。

阅读英文原文

症状

插入以 E11000 duplicate key error 失败,消息给出唯一索引名与重复值。这说明具有相同索引键的文档已存在,因此该插入要么是真正的重复,要么是对已成功写入的重试。并发下两个写者可能竞速、其一失败,这是唯一索引的预期行为而非数据库缺陷。

诊断

读取索引名与重复值;查询是否存在既有文档;对幂等写入改用 upsert。

mongo --eval "db.users.getIndexes()"

根因

插入或更新违反了唯一索引,因为相同索引键的文档已存在,或该操作是对已成功操作的重试。

修复

按情形处理:写入应幂等时用 upsert;记录已存在时捕获重复错误并改为更新;让重试逻辑把重复视为先前可能成功的信号。仅在确实不需要唯一性时才删除唯一索引。

验证

重跑写入确认无重复键错误,并确认该键对应恰好一个文档。文档唯一即证明幂等处理生效。

常见陷阱

为消除 E11000 直接删除唯一索引会放弃数据完整性;应先用 upsert 或更新替代插入。