(PECL mongo >=0.9.2)
MongoCollection::group — Выполняет операцию, аналогичную команде SQL GROUP BY
keys
Поля для группировки. Если передан массив или объект без кода, это будет ключ, используемый для группировки результатов.
1.0.4+: Если keys
является
экземпляром MongoCode,
keys
будут обрабатываться как функция,
которая возвращает ключ для группировки (смотрите пример "Передача
функции keys
" ниже).
initial
Начальное значение объекта счетчика агрегации.
reduce
Функция, которая принимает два аргумента (текущий документ и агрегацию на данный момент) и выполняет агрегацию.
options
Необязательные параметры для групповой команды. Допустимые варианты:
"condition"
Критерии включения документа в агрегацию.
"finalize"
Функция вызывается один раз для каждой уникальной клавиши, которая принимает окончательный результат функции reduce.
"maxTimeMS"
Указывает суммарный лимит времени в миллисекундах на обработку операции (не включая время простоя) на сервере. Если операция на стороне сервера не завершилась за это время, то вызывается исключение MongoExecutionTimeoutException.
Возвращает массив, содержащий результат.
Версия | Описание |
---|---|
1.5.0 | Добавлена опция "maxTimeMS". |
1.2.11 |
Выдает E_DEPRECATED , когда используется
options , как scalar.
|
Пример #1 Пример использования MongoCollection::group()
Группирует документы по категориям и создает список имен в этой категории.
<?php
$collection->insert(array("category" => "fruit", "name" => "apple"));
$collection->insert(array("category" => "fruit", "name" => "peach"));
$collection->insert(array("category" => "fruit", "name" => "banana"));
$collection->insert(array("category" => "veggie", "name" => "corn"));
$collection->insert(array("category" => "veggie", "name" => "broccoli"));
$keys = array("category" => 1);
$initial = array("items" => array());
$reduce = "function (obj, prev) { prev.items.push(obj.name); }";
$g = $collection->group($keys, $initial, $reduce);
echo json_encode($g['retval']);
?>
Результатом выполнения данного примера будет что-то подобное:
[{"category":"fruit","items":["apple","peach","banana"]},{"category":"veggie","items":["corn","broccoli"]}]
Пример #2 Пример использования MongoCollection::group()
Этот пример не использует никаких ключей, поэтому каждый документ будет иметь свою собственную группу. Он также использует условие: только те документы, которые соответствуют этому условию, будут обрабатываться функцией группировки.
<?php
$collection->save(array("a" => 2));
$collection->save(array("b" => 5));
$collection->save(array("a" => 1));
// используем все поля
$keys = array();
// устанавливаем начальные значения
$initial = array("count" => 0);
// функция JavaScript для выполнения
$reduce = "function (obj, prev) { prev.count++; }";
// используем только те документы, у которых поле "а" больше 1
$condition = array('condition' => array("a" => array( '$gt' => 1)));
$g = $collection->group($keys, $initial, $reduce, $condition);
var_dump($g);
?>
Результатом выполнения данного примера будет что-то подобное:
array(4) { ["retval"]=> array(1) { [0]=> array(1) { ["count"]=> float(1) } } ["count"]=> float(1) ["keys"]=> int(1) ["ok"]=> float(1) }
Пример #3 Передача функции keys
Если вы хотите сгруппировать по чему-то отличному от имен полей, вы можете передать функцию в качестве первого параметра MongoCollection::group(), и она будет выполняться для каждого документа. Возвращаемое значение функции будет использоваться в качестве значения группировки.
Этот пример демонстрирует группирование по числовому полю по модулю 4.
<?php
$c->group(new MongoCode('function(doc) { return {mod : doc.num % 4}; }'),
array("count" => 0),
new MongoCode('function(current, total) { total.count++; }'));
?>