MongoCollection::aggregate

(PECL mongo >=1.3.0)

MongoCollection::aggregateEffectue une agrégation en utilisant le framework dédié

Description

public array MongoCollection::aggregate ( array $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.

Liste de paramètres

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.

Valeurs de retour

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.

Erreurs / Exceptions

Lorsqu'une erreur survient, un tableau contenant les clés suivantes sera retourné :

  • errmsg - contient la raison de l'échec
  • code - le code erreur de l'échec
  • ok - vaudra 0.

Exemples

Exemple #1 Exemple avec MongoCollection::aggregate()

<?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);
?>
<?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);
?>
<?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)
}

Voir aussi

LoadingChargement en cours