MongoDB:MapReduceの手続きを外部jsファイルに保存して実行する方法

MapReduce処理を外部ファイルとして保存する

ファイル名:count_by_hours.js
// accesslogを時間帯別に集計して、
// 結果を別コレクションに保存するMapReduce

//出力先コレクション名を定義
var colname = 'countbyhours'; 

// 自作ユーティリティ関数
var JSTDate = function (str) {  return ISODate(str + "T00+09:00");  };

var getYMDH = function (d) {
    d.setSeconds(0);
    d.setMilliseconds(0);
    d.setMinutes(0);

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

    mm = new Number(mm).zeroPad(2);
    dd = new Number(dd).zeroPad(2);
    hh = new Number(hh).zeroPad(2);

    return yyyy + '-' + mm + '-' + dd + ' ' + hh + ':00:00';
};

// 期間指定のクエリ
var query  = { "timestamp" : { "$gte" : JSTDate("2011-11-01"), "$lt" : JSTDate("2011-11-02")  } };

// MapReduce処理
var m = function () { emit( getYMDH(this.timestamp), 1) };
var r = function(key,values) { return Array.sum(values); };

db.accesslog.mapReduce(m,r, { query : query , scope : getYMDH ,  out : {merge: colname} } );

実行方法

Linux/UnixシェルからJSファイルを実行する

$ bin/mongo hostname/dbname  /home/dqneo/count_by_hours.js    
これをcrontabに登録しておけば、毎日バッチでMapReduceを行うことができます。
通常はこちらのやり方がよいでしょう。

Mongoシェル内からJSファイルを実行する

Mongoシェルにログインした状態で、外部JSファイルを実行することもできます。
load()関数を使います。
$ bin/mongo

> load('/home/dqneo/count_by_hours.js');
loadした瞬間にJSファイルが実行され、MapReduce処理が走ります。

思えば、MySQLやPostgreSQLにも似たような機能(外部SQLファイルの実行。OSシェルから呼び出したり、SQLプロンプトから呼び出したり)がありますね。
カテゴリ: