MongoDB Aggregation


アグリゲーション・フレームワーク – 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項目のみを出力する

evalphobia's profile picture

Written by evalphobia who loves cloud technology and IPA🍺.