MongoCollection
MongoCollection::batchInsert
MongoCollection
PHP Manual

# MongoCollection::aggregate

(PECL mongo >=1.3.0)

MongoCollection::aggregate — Perform an aggregation using the aggregation framework

### Beschreibung

public array MongoCollection::aggregate ( array `$pipeline` [, array `$op` [, array `$...` ]] )

The MongoDB » aggregation framework provides a means to calculate aggregated values without having to use MapReduce. While MapReduce is powerful, it is often more difficult than necessary for many simple aggregation tasks, such as totaling or averaging field values.

This method accepts either a variable amount of pipeline operators, or a single array of operators constituting the pipeline.

### Parameter-Liste

`pipeline`

  An array of pipeline operators, or just the first operator.

`op`

  The second pipeline operator.

`...`

  Additional pipeline operators.

### Rückgabewerte

The result of the aggregation as an array. The ok will be set to 1 on success, 0 on failure.

### Fehler/Exceptions

When an error occurs an array with the following keys will be returned:

- errmsg - containing the reason for the failure
- code - the errorcode of the failure
- ok - will be set to 0.

### Beispiele

Beispiel #1 MongoCollection::aggregate() example

The following example aggregation operation pivots data to create a set of author names grouped by tags applied to an article. Call the aggregation framework by issuing the following command:

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

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

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

The following examples use the » zipcode data set. Use mongoimport to load this data set into your mongod instance.

Beispiel #2 MongoCollection::aggregate() example

To return all states with a population greater than 10 million, use the following aggregation operation:

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

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

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

Beispiel #3 MongoCollection::aggregate() example

To return the average populations for cities in each state, use the following aggregation operation:

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

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

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

### Siehe auch

- The MongoDB » aggregation framework

MongoCollection
MongoCollection::batchInsert
MongoCollection
PHP Manual