在mongo和node中的大集合上迭代游标不会返回所有结果?

我有一个有50万个文件的集合(集合需要大约130MB)

我正在使用标准的mongodb驱动程序:

var mongodb = require('mongodb'); 

我想通过使用游标在node.js中迭代这个集合。 (因为.toArray花费太长时间才能将整个数据集放入内存中)

 var cursor = db.collection('test').find({}); cursor.each(function(err, doc) { // only does this 1000 times }); 

我发现它只做了1000次,所以我看了文档https://mongodb.github.io/node-mongodb-native/api-generated/cursor.html,并在“每个”部分,它说:增加批量大小。

所以我做了一个非常大的批量大小,我没有find一个方法来使其无限。 如果你知道的方式让我知道。

 var cursor = db.collection('test').find({}).batchSize(1000000000000); cursor.each(function(err, doc) { // only does this 30382 times }); 

而增加批量的大小不会使它迭代更多的元素,然后30382。

如何使cursor.each()迭代500,000次?

您可以跟踪索引,并在发生错误时继续从您离开的地方继续:

 const iterateCollection = (skip) => { const cursor = db.collection('test').find({}).skip(skip); cursor.each(function(err, doc) { skip++; if(err){ //if err due to overflow iterateCollection (skip) } }); }; iterateCollection(0); 

我设法用“forEach”而不是“each”来解决这个问题…我不知道有什么区别,我知道它到目前为止工作。 所以

 var cursor = db.collection('test').find(); cursor.forEach(function(doc) { // do stuff, does it 500,000 times for my collection... }, function(err) { // finished db.close(); }); 

现在唯一的问题就是一月份的糖蜜速度慢,所以会有兴趣去听其他的解决scheme。