LoginSignup
28
31

More than 5 years have passed since last update.

MongoDBで集計(Aggregate)

Last updated at Posted at 2014-07-15

churippu_s.pngAggregation

MongoDBでは集計のために Aggregation という仕組みが用意されているのですよ。すわ!便利。

例として、WebShopsコレクション(≒テーブル)に各Web店舗のアクセス数が日単位で記録されているものとし、ここ一週間のアクセスランキングを取得してみます。

PHPでのサンプルコードは下記のようになります。

PHP
// MongoDBへ接続
$mongo = new Mongo();
// MyDBデータベース
$db = $mongo->selectDB('mydb');
// WebShopsコレクション(≒テーブル)
$collShops = $db->selectCollection("webshops");
// ここ一週間でのWebアクセスが多い順に店舗を取得
$docs = $collShops->aggregate(
    array(
        // $match は WHERE句に相当
        array(
            '$match' => array(
                'chiiki_id' => $chiiki_id,
                'date' => array('$gt' => date('Ymd', strtotime("-7 days")))
            )
        ),
        // $group は GROUP BY句に相当
        array(
            '$group' => array(
                '_id' => '$shopid',
                'count' => array('$sum' => '$access')
            )
        ),
        // $sort は ORDER BY句に相当
        array(
            '$sort' => array(
                'count' => -1
            )
        ),
        // $limit は LIMIT句に相当
        array(
            '$limit' => 10
        )
    )
);
// 店舗格納用配列
$ShopList = array();
// 取得成功なら配列に格納していく
if($docs['ok'] == 1) {
    foreach ($docs['result'] as $id => $obj) {
        $ShopList[] = $obj;
    }
}
// 表示
print_r($ShopList);

詳細については参考URLで知見を深めて下さい。。。

churippu_s.png参考URL

▼第10回 MongoDBでの集計処理|MongoDBでゆるふわDB体験
http://gihyo.jp/dev/serial/01/mongodb/0010

▼mongoDBの集計にはMapReduceよりaggregateが簡単で楽な件
http://chobi.hatenablog.jp/entry/2013/06/16/201152

▼MongoDBに触れる (3) 集計処理 (Aggregationフレームワーク)
http://blog.zdrv.com/archives/457

▼SQL to Aggregation Mapping Chart
http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/

以上です。

28
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
31