アグリゲーション・フレームワーク – Aggregation Framework
参考
- Aggregation Introduction (MongoDB Manual)
Aggregationとは
Aggregationとは「集合」を意味する英単語です。MongoDBにおけるAggregationはその名が示す通り、任意のドキュメントをある一定の規則に基づき、一つの集合体として処理することができます。
噛み砕いていうと、「20代女性ユーザーの週末のログイン率をだしたい!」とか「営業部の法人セールスの一人あたりの売上高を知りたい…」のような集計が、Aggregationを使って比較的簡単にできてしまいます。
例えば以下の様な集計処理を行うことができます。
- 合計値の算出(SUM)
- 平均値の算出(AVG)
- 個数のカウント(COUNT)
- etc.
RDBMSでのGROUP BY?
MongoDBのAggregationは、他のRDBMS製品での、GROUP BY
句を使った集計処理と同等の処理を行うことができます。
以下は簡易な対比のリストとなります。(from:SQL to Aggregation Mapping Chart)
とりあえず使用してみる
db.<コレクション名>.aggregation([
{
$group : { _id : "$<キー名>" }
}
]);
上記コマンドは、キー名でグルーピングする処理になります。SQLにすると下記のような形と同一になります。
SELECT *
FROM <コレクション名>
GROUP BY <キー名> ;
パイプライン処理
Linuxシェルでパイプして、コマンドの結果を利用するように、MongoDBでもドキュメントの集計結果を後続の処理に渡すことが可能です。
Linuxのパイプの利用例:(from: なんちゃって鶯教さん)
$ history | head # <= historyの出力形式の確認しています(awkのため)
1 20131009 02:37:47 sudo mkdir -p /opt/boxen
2 20131009 02:37:47 ll
3 20131009 02:37:47 ls -l
4 20131009 02:37:47 ls -la /opt/
5 20131009 02:37:47 cd
6 20131009 02:37:47 mkdir repos
7 20131009 02:37:47 cd repos/
8 20131009 02:37:47 alias ll="ls -l"
9 20131009 02:37:47 alias la="ls -la"
10 20131009 02:37:47 la
$ history | awk '{print $4}' | sort | uniq -c | sort -nr | head # <= よく使うコマンドを上位から順番に表示する
391 ll
208 cd
110 ansible-playbook
86 vim
63 vagrant
63 git
62 ssh
47 sudo
44 ls
44 find
上記の例では
- history結果をすべて出力する
- (1)の結果を元に、
4番目の項目(コマンド部分)のみ抜き出した
結果を出力する - (2)の結果を元に、
名前順に並べ替えた
結果を出力する - (3)の結果を元に、
同一のコマンドをまとめてカウントした
結果を出力する - (4)の結果を元に、
数字の大きい順に並び替えた
結果を出力する - (5)の結果を元に、
上位10項目のみ
を出力する