Node.js用mongodb的cursor扫描1千万表

最近有这样一个需求,依次对1000万数据的表,进行每条记录依据不同逻辑的update操作,考虑到是全表的操作,于是考虑使用 cursor 游标来一个个修改,时间上没有限制。

Node.js 天生异步,所以代码不得不使用递归的形式来变现,大致伪代码如下:
function next(cursor){
cursor.next(function(err, data){
//处理data,update
if(finish) return console.log(“finish it !”);
return next(cursor);
})
}

var cursor = db.find(….);
next(cursor);
但是每次都在跑到500万左右的时候,报错了,报错如下:
Uncaught RangeError: Maximum call stack size exceeded
错误信息意思就是爆栈了,那我们就需要让js对栈进行一个gc或者回收,修改代码如下:
function next(cursor){
cursor.next(function(err, data){
//处理data,update
if(finish) return console.log(“finish it !”);
return setTimeout(function(){ next(cursor); },0);
})
}

var cursor = db.find(….);
next(cursor);
顺利执行完成1000万的扫描,使用 process.NextTick 是无效的