青柳です。
そろそろリリースされる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 件のコメント:
コメントを投稿