我有一个拥有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次?
答案 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();
});
现在唯一的问题是每个月的糖蜜都很慢,因此有兴趣听其他解决方案。