0

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

我在数据库中有 15k 行,我的索引是时间。

我以两种不同的方式做到了:

1)我重复时间间隔(对于每个间隔):-日期之间的原始数据请求-此间隔的 PHP 平均计算

2) Map and 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 服务器上进行了尝试,没有任何变化。

谢谢 :)

4

1 回答 1

0

听起来您正在映射所有数据并使用 reduce 将其过滤掉,而不是将查询限制在您的 PHP 查询获得的同一子集。

如果您还没有这样做,请在您的 mapreduce 调用中添加一个 {query:{}} 参数,如此处所述。

这只会将满足查询的文档子集传递给 map/reduce 操作。

于 2012-07-16T22:12:35.180 回答