10亿条定位数据,按时间和经纬度建立了复合索引,将某区域划分成同等大小的网格,需要求取每个网格,每个小时的定位数据。
划分之后近1W个网格,需要执行1w次查询,速度原来越慢都24小时了还没完成,求问有没有是优化的方法? 代码如下:
MongoClient.connect(mongodburl, function (err, db) {
var collection = db.collection('dingwei');
var collection2 = db.collection('hexgridkm');
var query={ time:{$gt:new Date("2015-04-11 12:00:00"),$lt:new Date("2015-05-13 00:00:00")},
loc : {
$geoWithin : {
$geometry : place.geometry
}
}
};
async.eachLimit(features,1,function(place,cb){
query.loc.$geoWithin.$geometry=place.geometry;
mapreduce(collection,query,place,function(docs){
collection2.insert(docs, function (err, data) {
cb();
})
})
},function(err){
console.log("success")
})
});
function mapreduce(collection,query,palace,cb){
var map=function(){
var key=new Date(this.time);
var month=key.getMonth()+1;
var day=key.getDate();
if(month<10)
month="0"+month;
if(day<10)
day="0"+day;
var id="2015-"+month+"-"+day+" "+key.getHours()+":00:00";
emit(id,1)
};
var reduce=function(key,values){
return values.length;
};
collection.mapReduce(map, reduce, {out : {inline: 1},query:query,sort:{time:1}}, function(err, results) {
if(err)
console.log(err);
else {
palace.properties.points=results;
palace.gridid=palace.properties.id;
palace.count=results.length;
cb(palace);
}
})
}
12 回复