从 MongoDB 获取“E11000 重复键错误”

问题描述 投票:0回答:1

我正在尝试使用 Python 和 PyMongo 包填充 MongoDB 集合。我有超过 300,000 个文档要插入,并且在插入 200,000 多个文档后出现上述错误。

对于上下文,我正在尝试构建一个猜词游戏并对单词进行排名。

这是我使用的代码块:

def post_rankings(client, db, collection, ranked_words): 
    try:
        ## Send a ping to confirm a successful connection
        client.admin.command('ping')
        print('Pinged! Successfully connected to MongoDB!')
        
        ## Establish connection to relevant collection
        db = client.get_database(db)
        collection = db.get_collection(collection)

        print(f'Adding {len(ranked_words)} ranked words to database...')
        for idx in range(len(ranked_words)):
            doc = {
                'text': ranked_words[idx], 
                'rank': idx + 1 ## Rankings start from 1
            }

            ## Add rankings to database
            _ = collection.insert_one(doc)

    except Exception as e:
        print('Error adding rankings to database: ', e)

这是 except 块的输出:

Error adding rankings to database:  E11000 duplicate key error collection: puzzles.temp_puzzle_30-07-2024 index: _id_ dup key: { _id: ObjectId('66a8cc4cfb818aa00ab9aab4') }, full error: {'index': 0, 'code': 11000, 'errmsg': "E11000 duplicate key error collection: puzzles.temp_puzzle_30-07-2024 index: _id_ dup key: { _id: ObjectId('66a8cc4cfb818aa00ab9aab4') }", 'keyPattern': {'_id': 1}, 'keyValue': {'_id': ObjectId('66a8cc4cfb818aa00ab9aab4')}}

我查看了该错误,似乎当您尝试插入一个 ID 已存在于集合中的文档时,就会发生这种情况。但是,由于我没有指定对象 id,因此只要添加文档,MongoDB 就会自动创建唯一的 id。

我在错误消息中查询了对象id,结果发现它属于最后插入的文档: object id in error message belongs to the last inserted doc #221471

看来 MongoDB 正在尝试重用以前的 id?这是我的猜测,但这对我来说并没有什么意义,特别是因为我在此之前在另一个集合中做了类似的事情(插入相同数量的文档),而且进展顺利。

类似的帖子还表明它可能与索引或默认值有关,但在我的情况下我不使用任何这些。

现在,我将删除该集合并重新运行代码,看看是否出现相同的错误。

python mongodb duplicates pymongo
1个回答
0
投票

该问题似乎可能是由于以下两个原因之一造成的。首先,您可能会在代码中手动插入

_id
字段,但由于此处情况并非如此,让我们考虑另一种可能性。确保没有可能与
_id
字段或您要插入的文档发生冲突的唯一索引。例如,如果文本字段上有唯一索引,则在插入重复文本值时可能会导致冲突。要检查可能导致问题的任何独特约束,请使用以下命令:

collection.index_information()

这将帮助您确定是否有任何唯一索引影响您的插入。

© www.soinside.com 2019 - 2024. All rights reserved.