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プロンプトから呼び出したり)がありますね。
カテゴリ:
MongoDB