MongoDB:MapReduceでscopeを使って関数を渡す方法

var query  = { "timestamp" : { "$gte" : ISODate("2011-11-01T00:00:00+09:00"), "$lt" : ISODate("2011-11-02T00:00:00+09:00") } };

// 自作関数をあらかじめ定義
var getYMDH = function (d) {

    // timestampを1時間単位に切り捨てる

    d.setSeconds(0);
    d.setMilliseconds(0);
    d.setMinutes(0);

    yy = d.getFullYear();
    mm = d.getMonth() + 1;
    dd = d.getDate();
    hh = d.getHours();

    if (mm < 10) { mm = "0" + mm; }
    if (dd < 10) { dd = "0" + dd; }
    if (hh < 10) { hh = "0" + hh; }
    return yy + '-' + mm + '-' + dd + ' ' + hh + ':00:00';
};

var m = function () {
   emit(getYMDH(this.timestamp;), 1);
};

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

// scopeオプションで自作関数を渡す(注1)
db.accesslog.mapReduce(m,r, { query : query , scope : {getYMDH : getYMDH,} ,  out : 'myresults' } );

// 実行結果をみる
db.myresults.find();
{ "_id" : "2011-11-01 00:00:00", "value" : 7546 }
{ "_id" : "2011-11-01 01:00:00", "value" : 2885 }
{ "_id" : "2011-11-01 02:00:00", "value" : 823 }
{ "_id" : "2011-11-01 03:00:00", "value" : 823 }
{ "_id" : "2011-11-01 04:00:00", "value" : 590 }
{ "_id" : "2011-11-01 05:00:00", "value" : 579 }
{ "_id" : "2011-11-01 06:00:00", "value" : 1365 }
{ "_id" : "2011-11-01 07:00:00", "value" : 3230 }
{ "_id" : "2011-11-01 08:00:00", "value" : 4344 }
{ "_id" : "2011-11-01 09:00:00", "value" : 5754 }
これで、mapもreduceも1行で書けるようになりました!!
追記
※注1 scopeの書き方が間違っていたので修正しました。

下記の記法は間違いのようです。
// ↓間違った書き方
db.accesslog.mapReduce(m,r, { query : query , scope : getYMDH ,  out : 'myresults' } );
カテゴリ: