このエクステンションは、対応するコマンドを [[\yii\mongodb\Command]] PHP メソッドにラップして、MongoDB aggregation 機能 に対するサポートを提供しています。
最も単純な MongoDB の aggregation 操作は count
と distinct
です。これらは、それぞれ、[[\yii\mongodb\Command::count()]]
と [[\yii\mongodb\Command::distinct()]] によって利用可能です。例えば、
$booksCount = Yii::$app->mongodb->createCommand()->count('books', ['category' => 'programming']);
[[\yii\mongodb\Collection::count()]] および [[\yii\mongodb\Collection::distinct()]] のショートカット・メソッドを使っても構いません。
$booksCount = Yii::$app->mongodb->getCollection('books')->count(['category' => 'programming']);
count()
および distinct()
のメソッドは、[[\yii\mongodb\Query]] クラスでも利用可能です。
$booksCount = (new Query())
->from('books')
->where(['category' => 'programming'])
->count();
Aggregation パイプライン を [[\yii\mongodb\Command::aggregate()]] によって実行することが出来ます。
次のサンプルは、authorId
フィールドで本をグループ化する方法を示すものです。
$authors = Yii::$app->mongodb->createCommand()->aggregate('books', [
[
'$group' => [
'_id' => '$authorId',
],
],
]);
ショートカットとして [[\yii\mongodb\Collection::aggregate()]] を使うことも出来ます。
次の例では、authorId
と category
のフィールドで本をグループ化しています。
$collection = Yii::$app->mongodb->getCollection('books');
$authors = $collection->aggregate([
[
'$group' => [
'_id' => '$authorId',
'category' => '$category',
],
],
]);
さらに洗練された aggregation のために、複数のパイプラインを指定することが出来ます。
次の例では、本を authorId
フィールドでグループ化し、createdAt
フィールドで降順にソートし、
そして、最初の 300 レコードをスキップして、結果を 100 ドキュメントまでに限定しています。
$collection = Yii::$app->mongodb->getCollection('books');
$authors = $collection->aggregate([
[
'$match' => [
'name' => ['$ne' => ''],
],
],
[
'$group' => [
'_id' => '$authorId',
],
],
[
'$sort' => ['createdAt' => -1]
],
[
'$skip' => 300
],
[
'$limit' => 100
],
]);
パイプラインの仕様についての詳細は MongoDB Aggregation Pipeline Docs を参照して下さい。
単純な aggregation は [[\yii\mongodb\Query]] クラスの次のメソッドによって実行することが出来ます。
sum()
- 指定されたカラムの値の合計を返す。average()
- 指定されたカラムの値の平均値を返す。min()
- 指定されたカラムの値の最小値を返す。max()
- 指定されたカラムの値の最大値を返す。これらのメソッドが呼び出されるときは [[\yii\mongodb\Query::$where]] がパイプライン組成時の $match
として使用されます。
use yii\mongodb\Query;
$maxPrice = (new Query())
->from('books')
->where(['name' => ['$ne' => '']])
->max('price', $db);
マップ・リデュース は [[\yii\mongodb\Command::mapReduce()]] によって実行することが出来ます。
$result = Yii::$app->mongodb->createCommand()->mapReduce('books',
'function () {emit(this.status, this.amount)}',
'function (key, values) {return Array.sum(values)}',
'mapReduceOut',
['status' => ['$lt' => 3]]
);
[[\yii\mongodb\Collection::mapReduce()]] をショートカットとして使うことも出来ます。
$result = Yii::$app->mongodb->getCollection('books')->mapReduce(
'function () {emit(this.status, this.amount)}',
'function (key, values) {return Array.sum(values)}',
'mapReduceOut',
['status' => ['$lt' => 3]]
);