症状
插入以 E11000 duplicate key error 失败,消息给出唯一索引名与重复值。这说明具有相同索引键的文档已存在,因此该插入要么是真正的重复,要么是对已成功写入的重试。并发下两个写者可能竞速、其一失败,这是唯一索引的预期行为而非数据库缺陷。
诊断
读取索引名与重复值;查询是否存在既有文档;对幂等写入改用 upsert。
mongo --eval "db.users.getIndexes()"
根因
插入或更新违反了唯一索引,因为相同索引键的文档已存在,或该操作是对已成功操作的重试。
修复
按情形处理:写入应幂等时用 upsert;记录已存在时捕获重复错误并改为更新;让重试逻辑把重复视为先前可能成功的信号。仅在确实不需要唯一性时才删除唯一索引。
验证
重跑写入确认无重复键错误,并确认该键对应恰好一个文档。文档唯一即证明幂等处理生效。
常见陷阱
为消除 E11000 直接删除唯一索引会放弃数据完整性;应先用 upsert 或更新替代插入。