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

Bulk processing in mongo is very slow for 1 million records

本文关键字:处理 非常 mongo 记录 万条 对于      更新时间:2023-09-26

请考虑以下场景:

CSV 文件由报告工具每周五生成。它包含组织中所有员工的记录(近 100 万名员工,而且还在增加)。

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

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

为了解决这个问题,我将新文件导入临时集合("EmployeeTemp")。

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

这个完整的过程是通过提交给 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);
    }
}

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

您可以尝试的另一件事是在设置无超时选项后添加 batchSize(500) 的第一个查找中更改批大小:

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