2012年8月29日水曜日

MongoDBのAggregationフレームワークの紹介

青柳です。
そろそろリリースされるMongoDB2.2で利用できるAggregationフレームワークについて紹介します。

例としてTwiiterAPIのHomeの結果をコレクションとして保存します。
具体的には以下のリンク先を参考にしてください。
https://dev.twitter.com/docs/api/1/get/statuses/home_timeline

・Count
コレクションやクエリーにマッチするオブジェクトの数を返します。

> db.tweet.count();
> db.tweet.count({user.screen_name: "aoyagikouhei"});

indexがあると早くなります。
> db.tweet.ensureIndex({user.screen_name: 1});

・Distinct
指定したキーに対してコレクションの個別のリストを返します。

>db.tweet.distinct("user.screen_name");
["aoyagikouhei", "masason"]

クエリーもオプションでつけられます。
> db.tweet.distinct("user.screen_name", {id : {$gte : 1234567}});

Distinctは単体のBSONを返すので最大ドキュメントサイズ(4MB/16MB)を超える場合はMapReduceを使います。

・Group
SQLのgroup byと同じような、要素をグループ化した配列を返します。
例えば、IDが1234567以降で各ユーザがつぶやいた数の集計は以下のようになります。

> db.tweet.group({
  key : {"user.screen_name" : true},
  cond : {id : {$gte : 1234567}},
  initial : {count : 0},
  reduce : function(obj, prev) {prev.count++;}
});

Groupも単体のBSONで返すので結果が大きい場合はMapReduceを使います。
また、複雑な集計の場合もGroupでは限界があるので、MapReduceを使います。

0 件のコメント:

コメントを投稿