我需要计算图表的平均值。
我在数据库中有15k行,我的索引是时间。
我用两种不同的方式:
1) 我重复时间间隔(对于每个间隔):-日期之间的原始数据请求-该区间的PHP平均计算
2) Map和Reduce:对于每个间隔,Reduce函数都在计算数据,然后在finalize函数中进行平均。
m = function() {
var k = new Date(this.date);
k.setSeconds(0);
k.setMilliseconds(0);
emit(
k, {
note: this.note
}
);
}
r = function(key, values) {
var reduced = {
note:0,
count:0,
noteAvg:0,
};
values.forEach(function(val) {
reduced.note += val.note;
reduced.count += val.count;
});
return reduced;
}
f = function(key, reduced) {
reduced.noteAvg = reduced.note / reduced.count;
return reduced;
}
$data_graph = $this->db->command(array(
"mapreduce" => "notes",
"map" => $map,
"reduce" => $reduce,
"finalize" => $finalize,
"query" => $req,
"out" => array("inline"=>1)
));
第二个解决方案比第一个慢很多时间。为什么?我应该尝试使用更多的数据进行比较吗?
我尝试了MongoLab(免费版)和我的本地mongo服务器,但没有任何变化。
感谢:)
听起来像是映射所有数据并使用reduce过滤掉,而不是将查询限制在PHP查询得到的相同子集。
如果您还没有这样做,请将{query:{}}参数添加到您的mapreduce调用中,如本文所述。
这只会将满足查询的文档子集传递给映射/减少操作。