迭代光标在mongo和节点上的大集合不会返回所有结果?

时间:2017-02-26 19:59:39

标签: javascript node.js mongodb

我有一个拥有500k文件的集合(集合需要大约 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,在“每个”部分下,它说增加批量大小。

所以我制作了一个非常大的批量大小,我找不到让它无限制的方法。如果你知道一种让我知道的方式。

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

再增加批量大小不会使其迭代更多元素然后30382。

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

2 个答案:

答案 0 :(得分:1)

您可以跟踪索引,并且可以从您再次离开的地方继续出错:

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

答案 1 :(得分:1)

我设法使用“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();
});

现在唯一的问题是每个月的糖蜜都很慢,因此有兴趣听其他解决方案。