gpt4 book ai didi

performance - 有没有办法跳过 Pymongo 3.0 中 insert_many 的现有 _id?

转载 作者:可可西里 更新时间:2023-11-01 09:09:33 25 4
gpt4 key购买 nike

我正在更新一个包含数百万文档且 _id 冲突少于 10 个的数据库。

我目前正在使用 PyMongo 模块通过 insert_many 进行批量插入:

  1. 查询数据库以查看_id 是否存在
  2. 如果 _id 不存在,则将文档添加到数组中
  3. 使用 insert_many 插入数据库,一次插入 1000 个文档。

在数百万个文档中只有大约 10 个冲突,我目前正在为每个 _id 查询数据库。我认为如果我可以减少查询过程,我可以将总插入时间减少一两天。

是否有类似于 upsert 的东西可能只插入不存在的文档?

最佳答案

处理此问题以及以有效方式“插入/更新”许多文档的更好方法是使用 Bulk Operations API以“批量”方式提交所有内容,高效发送所有内容并收到“单一回复”作为确认。

这可以通过两种方式处理。

首先要忽略主键或其他索引上的任何“重复错误”,然后您可以使用“无序”操作形式:

bulk = pymongo.bulk.BulkOperationBuilder(collection,ordered=False)
for doc in docs:
bulk.insert(doc)

response = bulk.execute()

那里的“UnOrdered”或false 参数意味着操作可以按任何顺序执行,并且“整个”批处理将完成,任何实际错误都将在响应中简单地“报告” .所以这是一种基本上“忽略”重复项并继续前进的方法。

替代方法大致相同,但使用“更新插入”功能以及 $setOnInsert :

bulk = pymongo.bulk.BulkOperationBuilder(collection,ordered=True)
for doc in docs:
bulk.find({ "_id": doc["_id"] }).upsert().updateOne({
"$setOnInsert": doc
})

response = bulk.execute()

.find() 中的“查询”部分用于使用“主键”或文档的“唯一键”查询文档是否存在。如果未找到匹配项,则会在创建新文档时发生“upsert”。由于所有修改内容都在$setOnInsert 中,因此只有在发生“upsert”时才会在此处修改文档字段。否则,当文档被“匹配”时,关于保存在该运算符下的数据实际上没有任何改变。

在这种情况下,“有序”意味着每个语句实际上都是按照创建时的“相同”顺序提交的。此外,这里的任何“错误”都会停止更新(在发生错误的地方),这样就不会更多的操作将被提交。它是可选的,但可能建议用于正常的“重复”行为,即后面的语句“复制”前一个语句的数据。

因此,为了更高效的写入,一般的想法是使用“批量”API 并相应地构建您的操作。这里的选择实际上取决于来自源的“插入顺序”对您是否重要。

当然,相同的 "ordered"=False 操作适用于 insert_many,它在较新的驱动程序版本中实际使用“批量”操作。但是,坚持使用可以使用简单 API 进行“混合”操作的通用接口(interface),您将获得更大的灵 active 。

关于performance - 有没有办法跳过 Pymongo 3.0 中 insert_many 的现有 _id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31375606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com