1

日付ごとにグループ化されたマップ削減があります。

map = %Q{
  function() {
    var rounded_time = this.created_at;
    rounded_time.setHours(0,0,0,0);
    emit(rounded_time.getTime() / 1000, this.total);
  }
}

reduce = %Q{
  function(key, values) {
    var result = 0;
    values.forEach(function(value) {
      result += value;
    });
    return result;
  }
}

data = Order.map_reduce(map, reduce).out(inline: true)

しかしもちろん、いくつかの日付には順序がないため、結果には表示されません。これは時系列グラフに入力されているため、それらの日にゼロがあると便利です。

欠落している日付をゼロで埋めるきれいな方法があるかどうか疑問に思っています。日付ごとにイニシャルemit(time, 0)を付けるのも 1 つの方法のようですが、mongo でそれを行う方法は見たことがありません。

そのため、データがマップリデュースから出た後にデータをマッサージすることに行き詰まっていますが、これはそれほど効率的ではなく、丸めエラーが発生しやすいものです。ありがとう!

4

1 に答える 1

0

これはおそらく、レポートを作成するときに行うのが最適です。

問題は、これらの行が存在せず、MR がループ内で自由に新しいドキュメントを実際に形成できず、入力されたドキュメントを変更することしかできないことです。

したがって、グラフ内のドキュメントを反復処理する場合、検索する時系列 (日、月、年) に使用する区切り記号を知っている可能性が高く、欠落しているこれらのポイントに 0 の値を追加するようにデータを簡単に変更できます。 . 通常、ループ内でカーソルをスクロールしてグラフを作成するのではなく、日付のリストをスクロールして、カーソルからその日付を取得するか、そこにゼロの値を設定するのが最善の方法です。

そのため、データがマップリデュースから出た後にデータをマッサージするのに行き詰まっていますが、これはそれほど効率的ではなく、丸めエラーが発生しやすいです

エラーが発生しにくいはずです。クライアント定義の(私が推測する)時間範囲を使用していて、デリミネーターでグループ化しているため、正しく実行されればデータベースと同じくらい正確である必要があります。

于 2012-12-04T10:22:02.230 に答える