(PECL mongo >=1.3.0)
MongoCollection::aggregate — Realiza una acumulación usando el framework de acumulación
$pipeline
[, array $op
[, array $...
]] )El » framework de agregación de MongoDB proporciona medios para calcular valores acumulados sin tener que usar MapReduce. Aunque MapReduce es potente, a menudo es más dificultoso de lo necesario para muchas tareas sencillas de acumulación, tales como totalizar o hallar la media de valores de campos.
Este método acepta tanto una cantidad variable de operadores de tubería como un único array de dichos operadores constituyendo la tubería.
pipeline
Un array de operadores de tubería, o simplemente el primer operador.
op
El segundo operador de tubería.
...
Operadores de tubería adicionales.
El resultado de la acumulación como un array. ok será establecido a 1 en caso de éxito, 0 en caso de error.
Cuando ocurre un error se devuelve un array con las siguientes claves:
Ejemplo #1 Ejemplo de MongoCollection::aggregate()
El siguiente ejemplo de operación acumulativa pivota datos para crear un conjunto de nombres de autores agrupados por etiquetas aplicadas a un artículo. Se llama al framework de acumulación usando el siguiente comando:
<?php
$m = new Mongo;
$c = $m->selectDB("examples")->selectCollection("article");
$datos = array (
'title' => 'this is my title',
'author' => 'bob',
'posted' => new MongoDate,
'pageViews' => 5,
'tags' => array ( 'fun', 'good', 'fun' ),
'comments' => array (
array (
'author' => 'joe',
'text' => 'this is cool',
),
array (
'author' => 'sam',
'text' => 'this is bad',
),
),
'other' =>array (
'foo' => 5,
),
);
$d = $c->insert($datos, array("w" => 1));
$ops = array(
array(
'$project' => array(
"author" => 1,
"tags" => 1,
)
),
array('$unwind' => '$tags'),
array(
'$group' => array(
"_id" => array("tags" => '$tags'),
"authors" => array('$addToSet' => '$author'),
),
),
);
$resultados = $c->aggregate($ops);
var_dump($resultados);
?>
El resultado del ejemplo sería:
array(2) { ["result"]=> array(2) { [0]=> array(2) { ["_id"]=> array(1) { ["tags"]=> string(4) "good" } ["authors"]=> array(1) { [0]=> string(3) "bob" } } [1]=> array(2) { ["_id"]=> array(1) { ["tags"]=> string(3) "fun" } ["authors"]=> array(1) { [0]=> string(3) "bob" } } } ["ok"]=> float(1) }
El siguiente ejemplo usa el » conjunto de datos de códigos zip. Utilice mongoimport para cargar este conjunto de datos en una instancia de mongod.
Ejemplo #2 Ejemplo de MongoCollection::aggregate()
Para devolver todos los estados con una población de más de 10 millones, se usa la siguiente operación acumulativa:
<?php
$m = new Mongo;
$c = $m->selectDB("test")->selectCollection("zips");
$salida = $c->aggregate(array(
'$group' => array(
'_id' => '$state',
'totalPop' => array('$sum' => '$pop')
)
),
array(
'$match' => array('totalPop' => array('$gte' => 10*1000*1000))
)
);
var_dump($salida);
?>
El resultado del ejemplo sería algo similar a:
array(2) { ["result"]=> array(7) { [0]=> array(2) { ["_id"]=> string(2) "TX" ["totalPop"]=> int(16986510) } [1]=> array(2) { ["_id"]=> string(2) "PA" ["totalPop"]=> int(11881643) } [2]=> array(2) { ["_id"]=> string(2) "NY" ["totalPop"]=> int(17990455) } [3]=> array(2) { ["_id"]=> string(2) "IL" ["totalPop"]=> int(11430602) } [4]=> array(2) { ["_id"]=> string(2) "CA" ["totalPop"]=> int(29760021) } [5]=> array(2) { ["_id"]=> string(2) "OH" ["totalPop"]=> int(10847115) } [6]=> array(2) { ["_id"]=> string(2) "FL" ["totalPop"]=> int(12937926) } } ["ok"]=> float(1) }
Ejemplo #3 Ejemplo de MongoCollection::aggregate()
Para devolver la población media de las ciudades de cada estado, use la siguiente operación acumulativa:
<?php
$m = new Mongo;
$c = $m->selectDB("test")->selectCollection("zips");
$salida = $c->aggregate(
array(
'$group' => array(
'_id' => array('state' => '$state', 'city' => '$city' ),
'pop' => array('$sum' => '$pop' )
)
),
array(
'$group' => array(
'_id' => '$_id.state',
'avgCityPop' => array('$avg' => '$pop')
)
)
);
var_dump($salida);
?>
El resultado del ejemplo sería algo similar a:
array(2) { ["result"]=> array(51) { [0]=> array(2) { ["_id"]=> string(2) "DC" ["avgCityPop"]=> float(303450) } [1]=> array(2) { ["_id"]=> string(2) "DE" ["avgCityPop"]=> float(14481.913043478) } [2]=> array(2) { ["_id"]=> string(2) "RI" ["avgCityPop"]=> float(18933.283018868) } [3]=> array(2) { ["_id"]=> string(2) "AL" ["avgCityPop"]=> float(7907.2152641879) } [4]=> array(2) { ["_id"]=> string(2) "NH" ["avgCityPop"]=> float(5232.320754717) } ... [45]=> array(2) { ["_id"]=> string(2) "WY" ["avgCityPop"]=> float(3359.9111111111) } [46]=> array(2) { ["_id"]=> string(2) "MN" ["avgCityPop"]=> float(5335.4865853659) } [47]=> array(2) { ["_id"]=> string(2) "OK" ["avgCityPop"]=> float(6155.7436399217) } [48]=> array(2) { ["_id"]=> string(2) "IL" ["avgCityPop"]=> float(9931.0182450043) } [49]=> array(2) { ["_id"]=> string(2) "WI" ["avgCityPop"]=> float(7323.0074850299) } [50]=> array(2) { ["_id"]=> string(2) "WV" ["avgCityPop"]=> float(2759.1953846154) } } ["ok"]=> float(1) }