MongoCollection::group

(PECL mongo >=0.9.2)

MongoCollection::groupВыполняет операцию, аналогичную команде SQL GROUP BY

Описание

public MongoCollection::group ( mixed $keys , array $initial , MongoCode $reduce , array $options = array() ) : array

Список параметров

keys

Поля для группировки. Если передан массив или объект без кода, это будет ключ, используемый для группировки результатов.

1.0.4+: Если keys является экземпляром MongoCode, keys будут обрабатываться как функция, которая возвращает ключ для группировки (смотрите пример "Передача функции keys" ниже).

initial

Начальное значение объекта счетчика агрегации.

reduce

Функция, которая принимает два аргумента (текущий документ и агрегацию на данный момент) и выполняет агрегацию.

options

Необязательные параметры для групповой команды. Допустимые варианты:

  • "condition"

    Критерии включения документа в агрегацию.

  • "finalize"

    Функция вызывается один раз для каждой уникальной клавиши, которая принимает окончательный результат функции reduce.

  • "maxTimeMS"

    Указывает суммарный лимит времени в миллисекундах на обработку операции (не включая время простоя) на сервере. Если операция на стороне сервера не завершилась за это время, то вызывается исключение MongoExecutionTimeoutException.

Возвращаемые значения

Возвращает массив, содержащий результат.

Список изменений

Версия Описание
PECL mongo 1.5.0 Добавлена опция "maxTimeMS".
PECL mongo 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++; }'));

?>