MongoCollection
PHP Manual

MongoCollection::aggregate

(PECL mongo >=1.3.0)

MongoCollection::aggregateRealiza una acumulación usando el framework de acumulación

Descripción

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

Parámetros

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.

Valores devueltos

El resultado de la acumulación como un array. ok será establecido a 1 en caso de éxito, 0 en caso de error.

Errores/Excepciones

Cuando ocurre un error se devuelve un array con las siguientes claves:

Ejemplos

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

Ver también


MongoCollection
PHP Manual