对于100万条记录,mongo中的批量处理速度非常慢

时间:2015-01-05 12:05:53

标签: javascript mongodb mongodb-query

考虑以下情况:

CSV文件由每个星期五的报告工具生成。它包含组织中所有员工的记录(近100万名员工,并且不断增加)。

这些数据使用mongoimport保存在mongo中"员工"集合。

但是,要求是发送"欢迎邮件"新员工和"年度完成邮件"现有员工。

要解决此问题,我将新文件导入临时集合(" EmployeeTemp")。

对于临时集合(EmployeeTemp)中的每条记录,我检查现有员工的旧集合("员工")并标记" SendYearCompletionFlag"是的。此外,如果找到新员工记录,我会标记" SendWelcomeFlag"是的。此外,每个员工的项目都需要更新。

这个完整的过程是通过提交给mongo的脚本执行的。

问题是剧本需要花费近18个小时才能完成。

请帮我减少脚本的执行时间。

这个脚本:

var list = db.employeeTemp.find().addOption(DBQuery.Option.noTimeout);
while(list.hasNext()){
    var f = list.next();
    var itr = db.employee.find({"eid":f.eid});
    var obj = itr.hasNext() ? itr.next() : null;
    if(!obj){
        f.joiningDate = new Date();
        f.sendWelcomeMail = true; 
        print("Saving New record : " + f.eid);
        db.save(f);
    } else {
        var joinDate = obj.joiningDate;     
        if(new Date().getTime()-joinDate>=31536000000){
            print("Sending Year Completion Mail to " + obj.eid)
            obj.sendYearCompletionMail = true;
        }
        obj.projecct = f.project;
        print("Saving Existing record : " + obj.eid);
        db.save(obj);
    }
}

1 个答案:

答案 0 :(得分:0)

我建议你在employee.eid上创建一个索引。

您可以尝试的另一件事是在设置no timeout选项后更改第一个find中添加batchSize(500)的批量大小:

http://docs.mongodb.org/manual/reference/method/cursor.batchSize/