Node.js 强制限制mongodb批量API

Node.js 强制限制mongodb批量API,node.js,mongodb,mongodb-query,Node.js,Mongodb,Mongodb Query,我想从一个集合中删除大量旧文档,因此使用批量api是有意义的。删除它们非常简单: var bulk=db.myCollection.InitializeUnderedBulkop(); 批量查找({ _身份证:{ $lt:oldestalallowedid } }).remove(); bulk.execute(); 唯一的问题是,这将尝试删除符合此条件的每个文档,在本例中,将删除数百万个文档,因此出于性能原因,我不希望一次删除所有文档。我想对操作执行一个限制,这样我就可以执行类似于bulk.

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

var bulk=db.myCollection.InitializeUnderedBulkop();
批量查找({
_身份证:{
$lt:oldestalallowedid
}
}).remove();
bulk.execute();
唯一的问题是,这将尝试删除符合此条件的每个文档,在本例中,将删除数百万个文档,因此出于性能原因,我不希望一次删除所有文档。我想对操作执行一个限制,这样我就可以执行类似于
bulk.limit(10000.execute()
并将操作间隔几秒钟,以防止锁定数据库的时间过长。但是,我一直无法找到任何可以传递给bulk的选项来限制它执行的次数

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


在任何人提到它之前,我知道bulk会自动将操作拆分为1000个文档块,但它仍然会以尽可能快的速度按顺序执行所有这些操作。这会对性能产生比我现在所能处理的更大的影响。

您可以使用该方法迭代与查询匹配的文档的
\u id
数组。返回该数组的最佳方法是使用方法。然后使用操作删除文档

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();
}

为什么不直接使用呢?您是否尝试过
bulk.find({…}).limit(10000.remove()与普通查询/光标一样?Nvm。刚刚尝试过,它对bulk不起作用。Markus,我完全可以使用
.remove()
,这就是我这次要做的,但我想知道是否有可能对bulk实施限制以获得更好的bulk操作性能。这是可能的,但实际上使用
var id=db.collection.find(查询,{u id:1})更有效
然后
bulk.find({$in:ids}).remove()
,但我真的很好奇我是否能在一个bulk操作中完成这一切。@robridle不!这是因为使用
Bulk
API不可能限制文档的数量。您还应该使用
distinct
返回
\u id
的数组,因为
\u id
是唯一的。Find永远不会返回
\u id
的重复结果,因为它是mongo的默认唯一索引,所以mongo
distinct
提供的额外逻辑对于该查询来说都是不必要的。如果它是一个不同的领域,它可能是。