db.A.find({}, {}, function(err, adata){
if (err) return callback(err);
//得到A表中的所有数据
adata.toArray(function(err, aArray){
if (err) return callback(err);
var len = aArray.length;
var result = [];
for (var i = 0; i < len; i++) {
var item = aArray;
var username = item._id.username;
var op = {username: username};
//查看B表中这条数据
db.B.findOne(op, {}, function(err, data){
allcount++;
if (data) {
result.push(data.username);
}
if (allcount === len) {
callback(null, result);
}
})
}
})
})
这段代码是能满足业务需求,但大家有没有发现它存在一个致命的问题?对,运行速度慢!
原因很简单,我是从A表中批量取到所有数据,然后又用findOne方法一条条去B表中查询,A表中有2w数据,也就是要查B表2w次,虽然B表中已经建立索引,但这样的查询逻辑明显是不可接受。知道问题所在,解决方案也就清楚了:对B表进行批量查询:
db.A.find({}, {}, function(err, adata){
if (err) return callback(err);
//得到A表中的所有数据
adata.toArray(function(err, aArray){
if (err) return callback(err);
var len = aArray.length;
var result = [];
var usernames = [];
for (var i = 0; i < len; i++) {
var item = aArray;
var username = item._id.username;
usernames.push(username);
}
var op = {username: {$in: usernames}};
//查看B表中这条数据
db.B.find(op, {}, function(err, bdata){
ddata.toArray(function(err, barray){
callback(barray);
})
})
})
})
经过这样的优化,程序性能会有明显的提升。
希望对大家有所帮助。