我目前面临着从数据库中的多个集合中删除 100M 以上文档,从 100k 文档到 100M 文档,总共约 300M 文档。此外,每个文档在其他集合中都有引用,这些引用必须被取消。我有一个所有要删除的文档的集合+ID的列表,目标是尽快删除它们,以便对用户的影响最小。
我当前的方法是通过发送 5k 组进行删除,{ _id: { $in: [] } }并以相同的分组方式并行发送对引用这些文档的所有集合的更新。事实证明这非常慢,所以我正在寻找替代方案。
我刚刚读到了有关批量写入 API 的信息,我想知道这是否是更好的解决方案。如果是这样,我很好奇使用它的最有效方法是什么。我是否应该像现在一样继续分组,但在一个批量请求中一次发送多个组?我是否应该停止在查询中进行分组,而是使用批量请求作为我的组,并包含 5k 个单独的删除/更新命令?
因为我们无法承受用户停机,而且该解决方案需要每天运行(尽管规模要小得多,因为我们正在赶上第一次运行),所以我无法使用萨尔瓦多·达利的解决方案。我最终将要删除的记录分为 1k 组,并发送一条 BulkWrite 命令,其中包含delete()针对每条记录的一个操作。同时,我发送了 n 个 BulkWrite 命令来取消对每个记录的引用,其中 n 是引用记录的集合的数量,并且每个 BulkWrite 请求都有 1k 个单独的update()操作,类似于delete(). 这执行得相当快,因此我没有尝试通过调整 BulkWrite 命令中的操作数量来进一步优化。
| 归档时间: |
|
| 查看次数: |
2879 次 |
| 最近记录: |