我已经在我的mongodb数据库中收集了大约10个月的文档,我希望能够计算一些简单的统计数据并输出它们。 我想要得到的统计数据是每个文档在一个时间间隔内的平均评分,每隔一小时。
要了解我正在尝试做什么,请按照以下sudo代码:
var dateTimeStart;
var dateTimeEnd;
var distinctHoursBetweenDateTimes = getHours(dateTimeStart, dateTimeEnd);
var totalResult=[];
foreach( distinctHour in distinctHoursBetweenDateTimes )
tmpResult = mapreduce_getAverageRating( distinctHour, distinctHour +1 )
totalResult[distinctHour] = tmpResult;
return totalResult;
我的文档结构如下: {_id,rating,topic,created_at}
Created_at是我收集统计数据的日期(插入时间和创建的时间并不总是相同)
我在created_at字段上创建了一个索引。
以下是我的mapreduce:
map = function (){
emit( this.Topic , { 'total' : this.Rating , num : 1 } );
};
reduce = function (key, values){
var n = {'total' : 0, num : 0};
for ( var i=0; i<values.length; i++ ){
n.total += values[i].total;
n.num += values[i].num;
}
return n;
};
finalize = function(key, res){
res.avg = res.total / res.num;
return res;
};
我很确定这可以更有效地完成 - 可能让mongo做更多工作,而不是连续运行几个map-reduce语句。
此时每次map-reduce大约需要20-25秒,因此计算几天内所有小时的统计数据会突然耗费很长时间。
我的印象是mongo应该适合这种工作 - 因此我显然必须做错事。
感谢您的帮助!
答案 0 :(得分:1)
我认为时间是MapReducing文档的一部分吗?
当你在所有文档上运行MapReduce时,确定map函数中的小时并将其添加到你发出的键中,你可以在一个MapReduce中完成所有这些。