(PECL mongo >=0.9.2)
MongoCollection::group — Lleva a cabo una operación similar al comando GROUP BY de SQL
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.
Devuelve un array que contiene el resultado.
Versión | Descripción |
---|---|
1.2.11 |
Emite un error de nivel E_DEPRECATED cuando
options es de tipo scalar.
|
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++; }'));
?>