MongoDBでSQL的なMAXの計算と日単位の集計
以下のようなデータがあるときに、ある期間のmaxを取る集計と、日単位の合計を出す集計をMongoDBのMapReduceで計算してみます。
{data_id: 123, insert_ts: Date(), data_count: 10}
2012/4/9 23:00から2012/4/10 24:00の間のdata_idの中で最大の件数を集計する。
data_id=123のデータを日単位でdata_countを合計する。
ちなみにdata_countは数字ならparseIntなんてしなくてもいいですが、何故か手持ちのデータが文字列だったので、わざわざ付けています。
{data_id: 123, insert_ts: Date(), data_count: 10}
2012/4/9 23:00から2012/4/10 24:00の間のdata_idの中で最大の件数を集計する。
m = function() { emit(this.data_id, parseInt(this.data_count)) };
r = function(key, values) {
var max_count = 0;
for (var i = 0; i < values.length; i++) {
if (max_count < values[i]) {
max_count = values[i]
}
}
return max_count;
};
res = db.data.mapReduce(m, r, {query: {insert_ts:{$gte: new Date(2012,3,9,18), $lt: new Date(2012,3,9,19)}}, out: 'tmp'});
data_id=123のデータを日単位でdata_countを合計する。
m = function() {
var dt = this.insert_ts;
dt.setTime(dt.getTime() + 9 * 3600);
emit(String(dt.getFullYear()) + "-" + String(dt.getMonth() + 1) + "-" + String(dt.getDate()), parseInt(this.data_count));
};
r = function(key, values) {
var data_count = 0;
for (var i = 0; i < values.length; i++) {
data_count += values[i];
}
return data_count;
};
res = db.data.mapReduce(m, r, {query: {data_id: 123}, out: 'tmp2'});
ちなみにdata_countは数字ならparseIntなんてしなくてもいいですが、何故か手持ちのデータが文字列だったので、わざわざ付けています。
| HOME |