node.js - 对 mongodb 批量 API 实现限制

标签 node.js mongodb mongodb-query

我想从一个集合中删除大量旧文档,因此使用批量 api 很有意义。删除它们非常简单:

var bulk = db.myCollection.initializeUnorderedBulkOp();

bulk.find({
  _id: {
    $lt: oldestAllowedId
  }
}).remove();

bulk.execute();

唯一的问题是这将尝试删除每个符合此条件的文档,在本例中是数百万个文档,因此出于性能原因,我不想一次删除它们。我想对操作施加限制,以便我可以执行类似 bulk.limit(10000).execute(); 的操作并将操作间隔几秒钟,以防止长时间锁定数据库比必要的。但是,我一直找不到任何可以传递给 bulk 以限制其执行次数的选项。

有没有办法以这种方式限制批量操作?

在有人提及之前,我知道 bulk 会自动将操作拆分为 1000 个文档 block ,但它仍会尽可能快地按顺序执行所有这些操作。这导致的性能影响比我现在可以处理的要大得多。

最佳答案

您可以使用 .forEach 迭代那些与您的查询匹配的文档的 _id 数组方法。返回该数组的最佳方法是使用 .distinct()方法。然后你使用 "bulk"删除文档的操作。

var bulk = db.myCollection.initializeUnorderedBulkOp();
var count = 0;

var ids = db.myCollection.distinct('_id', { '_id': { '$lt': oldestAllowedId } } );

ids.forEach(function(id) {
    bulk.find( { '_id': id } ).removeOne();
    count++;
    if (count % 1000 === 0) {
        // Execute per 1000 operations and re-init
        bulk.execute();
        // Here you can sleep for a while 
        bulk = db.myCollection.initializeUnorderedBulkOp();
    }
});

// clean up queues
if (count > 0 ) {
    bulk.execute();
}

关于node.js - 对 mongodb 批量 API 实现限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35093355/

相关文章:

mongodb - 如何在 cursor.ForEach 中打印文档?

javascript - 练习将变量初始化为 false

node.js - Nodejs 两条路径的区别

javascript - Jasmine Node 说 "0 tests"当有*有*测试

json - 如何使用expressjs通过body参数传递通用变量来更新属性

MongoDB 全文搜索 - 匹配单词和精确短语

javascript - 在 for 循环中的异步函数调用中有条件地执行回调

mongodb - "populate"具有 $lookup 的字段而不覆盖现有值

MongoDB 聚合文档返回计数或 0

node.js - 使用 MongoDB 进行数据分区