0

チャートの平均を計算する必要があります。

データベースには 15,000 行あります。インデックスは時間です。

私は2つの異なる方法でそれを行いました:

1)私は時間間隔で繰り返します(間隔ごとに):-日付間の生データリクエスト-この間隔のPHPでの平均計算

2) マップとリデュース: 各間隔でリデュース関数がデータをカウントし、ファイナライズ関数で平均を作成します。

    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)
    ));

2 番目の解決策は、最初の解決策よりもかなり時間がかかります。なんで?より多くのデータを使用して比較する必要がありますか?

MongoLab (無料版) とローカルの mongo サーバーを試してみましたが、何も変わりませんでした。

ありがとう :)

4

1 に答える 1

0

PHPクエリが取得するのと同じサブセットにクエリを制限するのではなく、すべてのデータをマッピングしてreduceでフィルタリングしているようです。

{query:{}} パラメータを mapreduce 呼び出しに追加していない場合は、こちらの説明に従って追加してください。

これにより、クエリを満たすドキュメントのサブセットのみが map/reduce 操作に渡されます。

于 2012-07-16T22:12:35.180 に答える