使用PHP与Map和Reduce MongoDB的经典平均演算



我需要计算图表的平均值。

我在数据库中有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调用中,如本文所述。

这只会将满足查询的文档子集传递给映射/减少操作。

相关内容

  • 没有找到相关文章

最新更新