MongoCollection::aggregateRealiza una acumulación usando el framework de acumulación
&reftitle.description;
publicarrayMongoCollection::aggregatearraypipelinearrayoptionspublicarrayMongoCollection::aggregatearrayoparrayoparray...
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.
&reftitle.parameters;
pipeline
Un array de operadores de tubería.
optionsOpciones para el comando de acumulación. Las opciones válidas son:"allowDiskUse"Permitir que la agregación pueda escribir ficheros temporales"cursor"
Opciones para controlar la creación del objeto cursor. Esta opción
causa que el comando devuelva un documento de resultados apto para construir
un MongoCommandCursor. Si fuera necesario
usar esta opción, se debería considerar el uso
MongoCollection::aggregateCursor.
"explain"Devuelve información sobre el procesamiento de la tubería.
&mongo.command.parameters.maxtimems;
Orop
Primer operador de tubería.
op
Segundo operador de tubería.
...
Operadores de tubería adicionales.
&reftitle.returnvalues;
Un array con el resultado de la acumulación. ok será
establecido a 1 en caso de éxito, 0 en caso de error.
&reftitle.errors;
Cuando ocurre un error se devuelve un array con las siguientes claves:
errmsg - contiene la razón del fallo
code - el código de error del fallo
ok - será establecido a 0.
&reftitle.changelog;
&Version;&Description;1.5.0
Se añadió el parámetro opcional options
&reftitle.examples;
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:
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);
?>
]]>
&example.outputs;
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 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:
selectDB("test")->selectCollection("zips");
$tubería = array(
array(
'$group' => array(
'_id' => array('state' => '$state', 'city' => '$city' ),
'pop' => array('$sum' => '$pop' )
)
),
array(
'$group' => array(
'_id' => '$_id.state',
'avgCityPop' => array('$avg' => '$pop')
)
)
);
$salida = $c->aggregate($tubería);
var_dump($salida);
?>
]]>
&example.outputs.similar;
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 de MongoCollection::aggregate
Para devolver la población media de las ciudades de cada estado, use la siguiente operación acumulativa:
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);
?>
]]>
&example.outputs.similar;
array(51) {
[0]=>
array(2) {
["_id"]=>
string(2) "DC"
["avgCityPop"]=>
float(303450)
}
[1]=>
array(2) {
["_id"]=>
string(2) "DE"
["avgCityPop"]=>
float(14481.913043478)
}
...
[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)
}
]]>
MongoCollection::aggregate con opciones de comandos
Para devolver información sobre cómo será procesada la tubería, se usa la opción de comando explain
selectDB("test")->selectCollection("zips");
$tubería = array(array(
'$group' => array(
'_id' => '$state',
'totalPop' => array('$sum' => '$pop'),
),
),
array(
'$match' => array('totalPop' => array('$gte' => 10*1000*1000)),
),
array(
'$sort' => array("totalPop" => -1),
),
);
$opciones = array("explain" => true);
$salida = $c->aggregate($tubería, $opciones);
var_dump($salida);
?>
]]>
&example.outputs.similar;
array(4) {
[0]=>
array(1) {
["$cursor"]=>
array(3) {
["query"]=>
array(0) {
}
["fields"]=>
array(3) {
["pop"]=>
int(1)
["state"]=>
int(1)
["_id"]=>
int(0)
}
["plan"]=>
array(4) {
["cursor"]=>
string(11) "BasicCursor"
["isMultiKey"]=>
bool(false)
["scanAndOrder"]=>
bool(false)
["allPlans"]=>
array(1) {
[0]=>
array(3) {
["cursor"]=>
string(11) "BasicCursor"
["isMultiKey"]=>
bool(false)
["scanAndOrder"]=>
bool(false)
}
}
}
}
}
[1]=>
array(1) {
["$group"]=>
array(2) {
["_id"]=>
string(6) "$state"
["totalPop"]=>
array(1) {
["$sum"]=>
string(4) "$pop"
}
}
}
[2]=>
array(1) {
["$match"]=>
array(1) {
["totalPop"]=>
array(1) {
["$gte"]=>
int(10000000)
}
}
}
[3]=>
array(1) {
["$sort"]=>
array(1) {
["sortKey"]=>
array(1) {
["totalPop"]=>
int(-1)
}
}
}
}
["ok"]=>
float(1)
}
]]>
&reftitle.seealso;
MongoCollection::aggregateCursorEl framework de acumulación de MongoDB