スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

rubyでmongodbのmap/reduceをする

rubyでmongodbのmap/reduceをします。
stored functionも試してみます。

まずデータの準備。ここのを拝借。

db.sessions.save( { userid: "a", ts: ISODate('2011-11-03 14:17:00'), length: 95 } );
db.sessions.save( { userid: "b", ts: ISODate('2011-11-03 14:23:00'), length: 110 } );
db.sessions.save( { userid: "c", ts: ISODate('2011-11-03 15:02:00'), length: 120 } );
db.sessions.save( { userid: "d", ts: ISODate('2011-11-03 16:45:00'), length: 45 } );
db.sessions.save( { userid: "a", ts: ISODate('2011-11-04 11:05:00'), length: 105 } );
db.sessions.save( { userid: "b", ts: ISODate('2011-11-04 13:14:00'), length: 120 } );
db.sessions.save( { userid: "c", ts: ISODate('2011-11-04 17:00:00'), length: 130 } );
db.sessions.save( { userid: "d", ts: ISODate('2011-11-04 15:37:00'), length: 65 } );

で、ソースは以下の通り。

require 'mongo'
client = Mongo::MongoClient.new('localhost', 27017)
db = client['test']
coll = db['sessions']
trunc = <<EOS
function (date) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
}
EOS
db.add_stored_function('trunc', trunc)
map = <<EOS
function() {
var key = trunc(this.ts);
var value = {count: 1};
emit( key, value );
}
EOS
reduce = <<EOS
function(key, values) {
var reducedObject = {count:0};
values.forEach( function(value) {
reducedObject.count += value.count;
});
return reducedObject;
}
EOS
coll.map_reduce(map, reduce, {out: 'session_stat'})


結果は以下の通り。
db.session_stat.find()
{ "_id" : ISODate("2011-11-02T15:00:00Z"), "value" : { "count" : 2 } }
{ "_id" : ISODate("2011-11-03T15:00:00Z"), "value" : { "count" : 4 } }
{ "_id" : ISODate("2011-11-04T15:00:00Z"), "value" : { "count" : 2 } }

truncはdbに保存されています。
db.system.js.find()
{ "_id" : "trunc", "value" : function (date) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
} }

最初からdb.system.jsに保存しておけば、rubyのソースにあるtruncの設定は必要ないです。
var trunc = function trunc(date) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
}
db.system.js.save({'_id': 'trunc', 'value': trunc});
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。