【问题标题】:How to do a massive random update with MongoDB / NodeJS如何使用 MongoDB / NodeJS 进行大规模随机更新
【发布时间】:2013-01-02 23:45:20
【问题描述】:

我有一个包含超过 1000000 个文档的 mongoDB 集合,我想用 dedicated 信息逐个更新每个文档(每个文档都有来自其他集合的信息)。

目前我正在使用从集合中获取所有数据的游标,并通过 Node.js 的异步模块更新每个记录

获取所有文档:

inst.db.collection(association.collection, function(err, collection) {
    collection.find({}, {}, function(err, cursor) {
        cursor.toArray(function(err, items){
                 ......
        );
    });
});

更新每个文档:

items.forEach(function(item) {
    // *** do some stuff with item, add field etc.
    tasks.push(function(nextTask) {
       inst.db.collection(association.collection, function(err, collection) {
           if (err) callback(err, null);
           collection.save(item, nextTask);
       });
    });
});

并行调用“保存”任务

async.parallel(tasks, function(err, results) {
    callback(err, results);
});

您会以更有效的方式进行此类操作吗?我的意思是如何避免加载游标的初始“查找”。现在有没有办法通过一个文档来做一个操作文档,知道所有文档都应该更新?

感谢您的支持。

【问题讨论】:

  • 您是否有理由在开始处理之前获取所有文档?为什么不只遍历一个游标而不是将它们全部读入一个数组并遍历一个数组?
  • 是的,我同意你的观点,但在处理每个文档之前,必须先加载光标。你有不同的例子吗?
  • 不是真的 - 文档将分批从服务器获取(默认一次 100 个)。您正在强制一次获取 所有 文档。

标签: node.js mongodb


【解决方案1】:

你的问题启发了我创建一个Gist to do some performance testing 来解决你的问题。

以下是在小型 EC2 实例上运行的结果,MongoDB 位于 localhost。测试场景是对 100000 个元素集合的每个文档进行唯一操作。

  1. 108.661 秒 -- 使用 find().toArray 一次提取所有项目,然后用单独的“保存”调用替换文档。
  2. 99.645 秒 -- 使用 find().toArray 一次提取所有项目,然后使用单独的“更新”调用更新文档。
  3. 74.553 秒 -- 迭代游标 (find().each),batchSize = 10,然后使用单独的更新调用。
  4. 58.673 秒 -- 迭代游标 (find().each),batchSize = 10000,然后使用单独的更新调用。
  5. 4.727 秒 -- 以 batchSize = 10000 迭代游标,并一次将 10000 个项目插入到新集合中。

虽然不包括在内,但我还使用 MapReduce 作为服务器端过滤器进行了测试,运行时间约为 19 秒。我本来希望类似地使用“聚合”作为服务器端过滤器,但它还没有输出到集合的选项。

最重要的答案是,如果你能侥幸逃脱,最快的选择是通过游标从初始集合中提取项目,在本地更新它们并将它们大块插入新集合中。然后,您可以将新集合换成旧集合。

如果您需要保持数据库处于活动状态,那么最好的选择是使用具有大批量大小的游标,并就地更新文档。 “保存”调用比“更新”慢,因为它需要替换整个文档,并且可能还需要重新索引。

【讨论】:

  • 太棒了,感谢您的回答。它清楚地解释了所有选项,谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-08
  • 2023-03-27
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多