MongoCollection
PHP Manual

MongoCollection::group

(PECL mongo >=0.9.2)

MongoCollection::groupLleva a cabo una operación similar al comando GROUP BY de SQL

Descripción

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

Parámetros

keys

Campos a agrupar. Si se pasa un array o un objeto que no es de código, será la clave usada para agrupar resultados.

1.0.4+: Si keys es una instancia de MongoCode, keys será tratado como una función que devuelve la clave con la que agrupar (revise el ejemplo de abajo sobre "Pasando una función a keys").

initial

Valor inicial del objeto contador combinado.

reduce

Una función que toma dos argumentos (el documento actual y la agregación en este punto) y realiza la agregación.

options

Parámetros opcionales para el comando group. Las opciones válidas incluyen:

  • "condition"

    Condición para incluir un documento a la agregación.

  • "finalize"

    Función que se invoca por cada clave única que toma la salida de la función reduce.

Valores devueltos

Devuelve un array que contiene el resultado.

Ejemplos

Ejemplo #1 Ejemplo de MongoCollection::group()

Agrupa los documentos por categoría y crea una lista de los nombres que hay dentro de la categoría.

<?php

$collection
->insert(array("categoria" => "fruta""nombre" => "manzana"));
$collection->insert(array("categoria" => "fruta""nombre" => "melocoton"));
$collection->insert(array("categoria" => "fruta""nombre" => "platano"));
$collection->insert(array("categoria" => "verdura""nombre" => "maiz"));
$collection->insert(array("categoria" => "verdura""nombre" => "brocoli"));

$keys = array("categoria" => 1);

$initial = array("items" => array());

$reduce "function (obj, prev) { prev.items.push(obj.nombre); }";

$g $collection->group($keys$initial$reduce);

echo 
json_encode($g['retval']);

?>

El resultado del ejemplo sería algo similar a:

[{"categoria":"fruta","items":["manzana","melocoton","platano"]},{"categoria":"verdura","items":["maiz","brocoli"]}]

Ejemplo #2 Ejemplo de MongoCollection::group()

Este ejemplo no utiliza ninguna clave, por lo que cada documento será su propio grupo. Además, usa una condición: sólo los documentos que la cumplan, serán procesados por la función de agrupación.

<?php

$collection
->save(array("a" => 2));
$collection->save(array("b" => 5));
$collection->save(array("a" => 1));

// usar todos los campos
$claves = array();

// establecer valores iniciales
$inicial = array("count" => 0);

// función JavaScript a realizar
$reduce "function (obj, prev) { prev.count++; }";

// usar sólo los documentos donde el campo "a" es mayor que 1
$condicion = array("a" => array( '$gt' => 1));

$g $collection->group($claves$inicial$reduce$condicion);

var_dump($g);

?>

El resultado del ejemplo sería algo similar a:

array(4) {
  ["retval"]=>
  array(1) {
    [0]=>
    array(1) {
      ["count"]=>
      float(1)
    }
  }
  ["count"]=>
  float(1)
  ["claves"]=>
  int(1)
  ["ok"]=>
  float(1)
}

Ejemplo #3 Pasando una función a keys

Si se desea agrupar por algo distinto a un nombre de campo, se puede pasar una función como primer parámetro de MongoCollection::group() y se ejecutará con cada documento. Se usará el valor devuelto de la función como valor de agrupación.

Este ejemplo demuestra cómo agrupar por el campo num módulo 4 (num % 4).

<?php

$c
->group(new MongoCode('function(doc) { return {mod : doc.num % 4}; }'),
     array(
"count" => 0),
     new 
MongoCode('function(current, total) { total.count++; }'));

?>

MongoCollection
PHP Manual