考虑以下情况:
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);
}
}
答案 0 :(得分:0)
我建议你在employee.eid上创建一个索引。
您可以尝试的另一件事是在设置no timeout选项后更改第一个find中添加batchSize(500)的批量大小:
http://docs.mongodb.org/manual/reference/method/cursor.batchSize/