(PECL mongo >=1.3.0)
MongoCollection::aggregate — Effectue une agrégation en utilisant le framework dédié
$pipeline
[, array $op
[, array $...
]] )Le » framework agrégation de MongoDB fournit une façon de calculer des valeurs agrégées sans avoir à utiliser MapReduce. Bien que MapReduce soit performant, il est souvent plus compliqué que nécessaire pour des tâches d'agrégation simples, comme le calcul du total ou de la moyenne des valeurs d'un champ.
Cette méthode accepte soit une variable au début du pipeline des opérateurs, ou un tableau simple d'opérateurs constituant le pipeline.
pipeline
Un tableau d'opérateurs de pipeline, ou juste le premier opérateur.
op
Le second opérateur de pipeline.
...
Des opérateurs de pipeline additionnels.
Le résultat del'agrégation, sous la forme d'un tableau. La clé ok vaudra 1 en cas de succès, 0 si une erreur survient.
Lorsqu'une erreur survient, un tableau contenant les clés suivantes sera retourné :
Exemple #1 Exemple avec MongoCollection::aggregate()
L'exemple d'agrégation suivant opère sur des données pivots pour créer un jeu de noms d'auteurs, groupé par les tags appliqués à un article. Appelez le framework d'agrégation en utilisant la commande suivante :
<?php
$m = new Mongo;
$c = $m->selectDB("examples")->selectCollection("article");
$data = 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($data, 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'),
),
),
);
$results = $c->aggregate($ops);
var_dump($results);
?>
L'exemple ci-dessus va afficher :
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) }
L'exemple suivant utilise le » jeu de données zipcode. Utilisez mongoimport pour charger ce jeu de données dans l'instance mongod.
Exemple #2 Exemple avec MongoCollection::aggregate()
Pour retourner tous les états avec une population supérieure à 10 million, utilisez l'opération d'agrégation suivante :
<?php
$m = new Mongo;
$c = $m->selectDB("test")->selectCollection("zips");
$out = $c->aggregate(array(
'$group' => array(
'_id' => '$state',
'totalPop' => array('$sum' => '$pop')
)
),
array(
'$match' => array('totalPop' => array('$gte' => 10*1000*1000))
)
);
var_dump($out);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
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) }
Exemple #3 Exemple avec MongoCollection::aggregate()
Pour retourner la moyenne de la population pour les villes de chaque état, utilisez l'opération d'agrégation suivante :
<?php
$m = new Mongo;
$c = $m->selectDB("test")->selectCollection("zips");
$out = $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($out);
L'exemple ci-dessus va afficher quelque chose de similaire à :
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) }