使用pymongo的insert_many(ordered=False)仍遇E11000重复键错误
问题分析与解决思路
先澄清
ordered=False的实际作用:它不是让你看不到重复键错误,而是遇到错误时不中断整个批量插入流程,会继续尝试插入剩下的有效文档。但重复键的错误依然会被记录(在返回结果的write_errors里),或者以异常形式抛出,取决于你的错误处理逻辑。你遇到的
E11000 duplicate key error,根源不是插入列表内部有重复,而是这批记录里的某个唯一键字段值,和数据库中已存在的文档重复了。比如最常见的_id字段,或者你自己给集合创建的其他唯一索引字段。排查步骤:
- 仔细看错误信息,里面会明确指出是哪个键重复了,比如
key: { email: "xxx@xx.com" },先定位这个唯一索引字段。 - 挑出报错的那条记录,去数据库里查询该字段对应的值,确认是不是已经存在。
- 如果是自定义唯一索引导致的,你可以选择删除重复记录后再插入,或者调整索引规则;如果是
_id重复,检查是不是你手动指定了_id值,而这个值已经被库内文档占用。
- 仔细看错误信息,里面会明确指出是哪个键重复了,比如
补充:你提到的“插入列表内部存在重复才会报错”的说法,其实是指当列表内有重复唯一键,且
ordered=True时,插入到重复项就会中断;而ordered=False时,会跳过列表内的重复项继续插,但不管是列表内还是库内的重复,只要触发唯一索引,都会产生E11000错误,只是前者是列表内部冲突,后者是和现有数据冲突。
内容的提问来源于stack exchange,提问作者snapcrack
相关产品推荐
相关产品推荐

