This extension provides support for the MongoDB aggregation functionality wrapping corresponding commands into PHP methods of \yii\mongodb\Command.
The simplest MongoDB aggregation operations are count
and distinct
, which are available via \yii\mongodb\Command::count()
and \yii\mongodb\Command::distinct() correspondingly. For example:
$booksCount = Yii::$app->mongodb->createCommand()->count('books', ['category' => 'programming']);
You may as well use \yii\mongodb\Collection::count() and \yii\mongodb\Collection::distinct() shortcut methods:
$booksCount = Yii::$app->mongodb->getCollection('books')->count(['category' => 'programming']);
Methods count()
and distinct()
are also available at \yii\mongodb\Query class:
$booksCount = (new Query())
->from('books')
->where(['category' => 'programming'])
->count();
Aggregation Pipeline can be executed via \yii\mongodb\Command::aggregate().
The following example display how you can group books by authorId
field:
$authors = Yii::$app->mongodb->createCommand()->aggregate('books', [
[
'$group' => [
'_id' => '$authorId',
],
],
]);
You may as well use \yii\mongodb\Collection::aggregate() as shortcut.
In the following example we are grouping books by both authorId
and category
fields:
$collection = Yii::$app->mongodb->getCollection('books');
$authors = $collection->aggregate([
[
'$group' => [
'_id' => '$authorId',
'category' => '$category',
],
],
]);
Multiple pipelines can be specified for more sophisticated aggregation.
In the following example we are grouping books by authorId
field, sorting them by createdAt
field descending
and then we are limiting the result to 100 documents skipping first 300 records.
$collection = Yii::$app->mongodb->getCollection('books');
$authors = $collection->aggregate([
[
'$match' => [
'name' => ['$ne' => ''],
],
],
[
'$group' => [
'_id' => '$authorId',
],
],
[
'$sort' => ['createdAt' => -1]
],
[
'$skip' => 300
],
[
'$limit' => 100
],
]);
Please refer to MongoDB Aggregation Pipeline Docs for detailed information about pipeline specifications.
Simple aggregations can be performed via following methods of the \yii\mongodb\Query class:
sum()
- returns the sum of the specified column values.average()
- returns the average of the specified column values.min()
- returns the minimum of the specified column values.max()
- returns the maximum of the specified column values.In case of these methods invocation \yii\mongodb\Query::$where will be used for $match
pipeline composition.
use yii\mongodb\Query;
$maxPrice = (new Query())
->from('books')
->where(['name' => ['$ne' => '']])
->max('price', $db);
Map Reduce can be executed via \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]]
);
You may as well use \yii\mongodb\Collection::mapReduce() as shortcut.
$result = Yii::$app->mongodb->getCollection('books')->mapReduce(
'function () {emit(this.status, this.amount)}',
'function (key, values) {return Array.sum(values)}',
'mapReduceOut',
['status' => ['$lt' => 3]]
);