1

MongoDB に 10 分ごとの期間累計の合計を含むデータがあります。

db.test.insert({perEnd: ISODate('2013-06-05T18:00:00'), val: 7.3})
db.test.insert({perEnd: ISODate('2013-06-05T18:10:00'), val: 6.23})
db.test.insert({perEnd: ISODate('2013-06-05T18:20:00'), val: 4.1})
db.test.insert({perEnd: ISODate('2013-06-05T18:30:00'), val: 0.21})
db.test.insert({perEnd: ISODate('2013-06-05T18:40:00'), val: 12.1})
db.test.insert({perEnd: ISODate('2013-06-05T18:50:00'), val: 6.0})
db.test.insert({perEnd: ISODate('2013-06-05T19:00:00'), val: 8.9})
db.test.insert({perEnd: ISODate('2013-06-05T19:10:00'), val: .98})
db.test.insert({perEnd: ISODate('2013-06-05T19:20:00'), val: 14.7})

各時間終了期間の合計を見つけるために集計したいので、次の値を取得する必要があります。

ending 2013-06-05 18:00:00 - 7.3
ending 2013-06-05 19:00:00 - 37.54
ending 2013-06-05 20:00:00 - 15.68

組み込みの日付演算子を使用すると、すべての日付が最も近い境界に丸められる (切り捨てられる) ため、機能しません。切り上げる必要あります

> db.test.aggregate({$group: {_id: {Year: {$year: "$perEnd"},
                                    Day: {$dayOfYear: "$perEnd"},
                                    Hour: {$hour: "$perEnd"}},
                              sum: {$sum: "$val"}}})
{
        "result" : [
                { "_id" : { "Year" : 2013,
                            "Day" : 156,
                            "Hour" : 19 },
                  "sum" : 24.58 },

                { "_id" : { "Year" : 2013,
                            "Day" : 156,
                            "Hour" : 18 },
                  "sum" : 35.940000000000005 }
        ],
        "ok" : 1
}

まともなパフォーマンスでこれを達成する方法を見た人はいますか?

4

1 に答える 1

0

mongodb map-reduceを使用して実行できます。

var map = function(){
    var date = new Date(this.perEnd.getTime());
    if(date.getMinutes() > 0){
        date.setHours(date.getHours() + 1, 0, 0, 0);
    } else {
        date.setHours(date.getHours(), 0, 0, 0);
    }
    emit(date, this.val);
};

var reduce = function(key, values){
    return Array.sum(values)
};

db.collection.mapReduce(map, reduce, {out : {inline : 1}}, callback);

あなたのデータについて、次の結果が得られました。

[ { _id: Wed Jun 05 2013 21:00:00 GMT+0300 (EEST), value: 7.3 },
  { _id: Wed Jun 05 2013 22:00:00 GMT+0300 (EEST), value: 37.54 },
  { _id: Wed Jun 05 2013 23:00:00 GMT+0300 (EEST), value: 15.68 } ]
于 2015-12-23T18:24:02.143 に答える