为了账号安全,请及时绑定邮箱和手机立即绑定

解决E11000重复密钥错误集合:pymongo中的_id_ dup key

解决E11000重复密钥错误集合:pymongo中的_id_ dup key

侃侃尔雅 2023-08-08 10:22:02
我正在尝试使用bulk_write指令插入大量文档(+1M)。为此,我创建了一个 InsertOne 函数列表。python version = 3.7.4pymongo version = 3.8.0文档创建:document = {    'dictionary': ObjectId(dictionary_id),    'price': price,    'source': source,    'promo': promo,    'date': now_utc,    'updatedAt': now_utc,    'createdAt:': now_utc  }# add line to debugif '_id' in document.keys():    print(document)return document我通过从元素列表中添加新字段来创建完整的文档列表,并使用 InsertOne 创建查询bulk = []for element in list_elements:    for document in documents:        document['new_field'] = element        # add line to debug        if '_id' in document.keys():           print(document)        insert = InsertOne(document)        bulk.append(insert)return bulkbulk_write我使用命令进行插入collection.bulk_write(bulk, ordered=False)我附上文档https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.bulk_write根据文档,该_id字段是自动添加的 Parameter - document: The document to insert. If the document is missing an _id field one will be added.不知何故,这似乎是错误的,因为其中一些具有相同的价值。对于 1M 文档中的 700k 收到此错误(当然有不同的 _id)对 'E11000 duplicate key error collection: database.collection index: _id_ dup key: { _id: ObjectId(\'5f5fccb4b6f2a4ede9f6df62\') }' 我来说似乎是 pymongo 的错误,因为我在很多情况下使用了这种方法,但我没有使用如此大小的文档该_id字段肯定必须是唯一的,但是,由于这是由 pymongo 自动完成的,我不知道如何解决这个问题,也许使用 UpdateOne 和 upsert True 以及不可能的过滤器并希望得到最好的结果。我将不胜感激任何解决方案或解决这个问题
查看完整描述

2 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

看来,当我添加文档的新字段并将其附加到列表中时,我创建了同一元素的类似实例,因此我有相同的查询次数,这就是我出现重复键错误的原因len(list_elements)

为了解决这个问题,我将文档的副本附加到列表中

bulk.append(document.copy())

然后使用该列表创建查询


查看完整回答
反对 回复 2023-08-08
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

如果您的代码片段中的任何一个documents已经包含_id,则不会添加新的,并且您将面临出现重复错误的风险,正如您所观察到的。



查看完整回答
反对 回复 2023-08-08
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信