Javascript 在mongo和node中的大集合上迭代光标不会';你不能返回所有结果吗?
我有一个收藏,有500k个文档(收集大约需要 130mb) 我使用的是标准mongodb驱动程序:Javascript 在mongo和node中的大集合上迭代光标不会';你不能返回所有结果吗?,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我有一个收藏,有500k个文档(收集大约需要 130mb) 我使用的是标准mongodb驱动程序: var mongodb = require('mongodb'); 我试图使用游标在node.js中遍历这个集合。(因为.toArray将整个数据集放入内存所需时间太长) 我发现它只做了1000次,所以我查看了文档,在“每个”部分下,它说要增加批量大小 所以我做了一个非常大的批量,我没有找到一种方法使它无限大。如果你知道一个方法,让我知道 var cursor = db.collection('
var mongodb = require('mongodb');
我试图使用游标在node.js中遍历这个集合。(因为.toArray将整个数据集放入内存所需时间太长)
我发现它只做了1000次,所以我查看了文档,在“每个”部分下,它说要增加批量大小
所以我做了一个非常大的批量,我没有找到一种方法使它无限大。如果你知道一个方法,让我知道
var cursor = db.collection('test').find({}).batchSize(1000000000000);
cursor.each(function(err, doc) {
// only does this 30382 times
});
再增加批处理大小也不会使它迭代更多的元素,而不是30382
如何使
游标。each()
迭代500000次?您可以跟踪索引,如果出现错误,您可以再次从离开的位置继续:
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();
});
现在唯一的问题是forEach的速度很慢,就像一月份的糖蜜一样,所以我们有兴趣听听其他的解决方案
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();
});