使用mongodb优化每小时统计检索

时间:2012-11-16 09:28:32

标签: mongodb optimization pymongo database

我已经在我的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应该适合这种工作 - 因此我显然必须做错事。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我认为时间是MapReducing文档的一部分吗?

当你在所有文档上运行MapReduce时,确定map函数中的小时并将其添加到你发出的键中,你可以在一个MapReduce中完成所有这些。