Aggregation
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で知見を深めて下さい。。。
参考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/
以上です。