MongoDB 使用 forEach 的批量更新效率
MongoDB bulk update efficiency using forEach
您如何处理批量/批量更新文档(最多 10k 个文档)以及 forEach
?
(没有特定的更新标准,用于随机选择文档)
我正在考虑两个选项:
- 将
forEach
闭包中的所有文档 _id
收集到一个数组中,然后使用更新
collection.update({_id : {$in : idsArray}}, ...)
- 将
forEach
闭包中的更新查询添加到批量操作并在完成后执行,在
bulk.find({_id: doc.id}).updateOne({...});
bulk.execute();
的某处
我很快就会对此进行基准测试,但我想知道什么 I/O 更高效,并且考虑 'smart' 与 Mongo。
好的,我已经对这两个选项进行了基准测试。
TL;DR 选项一的速度是原来的两倍,所以收集 ID 并更新一次。
为了将来参考,更多详细信息:
- 数据库中的文档总数约为 500k。
- 每个文档包含大约 20-25 个字段。
- 更新了 10-30k 个文档。
结果(时间因机器而异,但重要的是相对差异):
- 使用 ids 数组更新一次:200-500 毫秒。
- 批量更新:600-1000 毫秒。
回过头来看,我认为 bulk 可能会更快,因为可能有一些隐藏的优化。但我知道这个问题缺少逻辑,操作越少可能意味着速度越快,因此批量速度越慢。
您如何处理批量/批量更新文档(最多 10k 个文档)以及 forEach
?
(没有特定的更新标准,用于随机选择文档)
我正在考虑两个选项:
- 将
forEach
闭包中的所有文档_id
收集到一个数组中,然后使用更新collection.update({_id : {$in : idsArray}}, ...)
- 将
forEach
闭包中的更新查询添加到批量操作并在完成后执行,在bulk.find({_id: doc.id}).updateOne({...}); bulk.execute();
的某处
我很快就会对此进行基准测试,但我想知道什么 I/O 更高效,并且考虑 'smart' 与 Mongo。
好的,我已经对这两个选项进行了基准测试。
TL;DR 选项一的速度是原来的两倍,所以收集 ID 并更新一次。
为了将来参考,更多详细信息:
- 数据库中的文档总数约为 500k。
- 每个文档包含大约 20-25 个字段。
- 更新了 10-30k 个文档。
结果(时间因机器而异,但重要的是相对差异):
- 使用 ids 数组更新一次:200-500 毫秒。
- 批量更新:600-1000 毫秒。
回过头来看,我认为 bulk 可能会更快,因为可能有一些隐藏的优化。但我知道这个问题缺少逻辑,操作越少可能意味着速度越快,因此批量速度越慢。