MongoDB Aggregation

Posted: October 09, 2013


アグリゲーション・フレームワーク – Aggregation Framework


参考


Aggregationとは

Aggregationとは「集合」を意味する英単語です。MongoDBにおけるAggregationはその名が示す通り、任意のドキュメントをある一定の規則に基づき、一つの集合体として処理することができます。

噛み砕いていうと、「20代女性ユーザーの週末のログイン率をだしたい!」とか「営業部の法人セールスの一人あたりの売上高を知りたい…」のような集計が、Aggregationを使って比較的簡単にできてしまいます。

例えば以下の様な集計処理を行うことができます。

  • 合計値の算出(SUM)
  • 平均値の算出(AVG)
  • 個数のカウント(COUNT)
  • etc.

RDBMSでのGROUP BY?

MongoDBのAggregationは、他のRDBMS製品での、GROUP BY句を使った集計処理と同等の処理を行うことができます。

以下は簡易な対比のリストとなります。(from:SQL to Aggregation Mapping Chart

Untitled


とりあえず使用してみる


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

上記の例では

  1. history結果をすべて出力する
  2. (1)の結果を元に、4番目の項目(コマンド部分)のみ抜き出した結果を出力する
  3. (2)の結果を元に、名前順に並べ替えた結果を出力する
  4. (3)の結果を元に、同一のコマンドをまとめてカウントした結果を出力する
  5. (4)の結果を元に、数字の大きい順に並び替えた結果を出力する
  6. (5)の結果を元に、上位10項目のみを出力する