我正在尝试使用 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,结果发现它属于最后插入的文档:
看来 MongoDB 正在尝试重用以前的 id?这是我的猜测,但这对我来说并没有什么意义,特别是因为我在此之前在另一个集合中做了类似的事情(插入相同数量的文档),而且进展顺利。
类似的帖子还表明它可能与索引或默认值有关,但在我的情况下我不使用任何这些。
现在,我将删除该集合并重新运行代码,看看是否出现相同的错误。
该问题似乎可能是由于以下两个原因之一造成的。首先,您可能会在代码中手动插入
_id
字段,但由于此处情况并非如此,让我们考虑另一种可能性。确保没有可能与 _id
字段或您要插入的文档发生冲突的唯一索引。例如,如果文本字段上有唯一索引,则在插入重复文本值时可能会导致冲突。要检查可能导致问题的任何独特约束,请使用以下命令:
collection.index_information()
这将帮助您确定是否有任何唯一索引影响您的插入。