MongoCollection::aggregate

(PECL mongo >=1.3.0)

MongoCollection::aggregatePerform an aggregation using the aggregation framework

说明

public MongoCollection::aggregate ( array $pipeline [, array $options ] ) : array
public MongoCollection::aggregate ( array $op [, array $op [, array $... ]] ) : 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.

参数

pipeline

An array of pipeline operators.

options

Options for the aggregation command. Valid options include:

  • "allowDiskUse"

    Allow aggregation stages to write to temporary files

  • "cursor"

    Options controlling the creation of the cursor object. This option causes the command to return a result document suitable for constructing a MongoCommandCursor. If you need to use this option, you should consider using MongoCollection::aggregateCursor().

  • "explain"

    Return information on the processing of the pipeline.

  • "maxTimeMS"

    Specifies a cumulative time limit in milliseconds for processing the operation on the server (does not include idle time). If the operation is not completed by the server within the timeout period, a MongoExecutionTimeoutException will be thrown.

Or

op

First pipeline operator.

op

The second pipeline operator.

...

Additional pipeline operators.

返回值

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

错误/异常

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.

更新日志

版本 说明
1.5.0 Added optional options argument

范例

Example #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 MongoClient("localhost");
$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);
?>

以上例程会输出:

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.

Example #2 MongoCollection::aggregate() example

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

<?php
$m 
= new MongoClient("localhost");
$c $m->selectDB("test")->selectCollection("zips");

$pipeline = array(
    array(
        
'$group' => array(
            
'_id' => array('state' => '$state'),
            
'totalPop' => array('$sum' => '$pop')
        )
    ),
    array(
        
'$match' => array(
            
'totalPop' => array('$gte' => 10 1000 1000)
        )
    ),
);
$out $c->aggregate($pipeline);
var_dump($out);
?>

以上例程的输出类似于:

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

Example #3 MongoCollection::aggregate() example

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

<?php
$m 
= new MongoClient;
$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);
?>

以上例程的输出类似于:

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

Example #4 MongoCollection::aggregate() with command options

To return information on how the pipeline will be processed we use the explain command option:

<?php
$m 
= new MongoClient;
$c $m->selectDB("test")->selectCollection("zips");

$pipeline = array(
    array(
        
'$group' => array(
            
'_id' => '$state',
           
'totalPop' => array('$sum' => '$pop'),
        ),
    ),
    array(
        
'$match' => array(
            
'totalPop' => array('$gte' => 10 1000 1000)
        )
    ),
    array(
        
'$sort' => array("totalPop" => -1),
    ),
);

$options = array("explain" => true);
$out $c->aggregate($pipeline$options);
var_dump($out);
?>

以上例程的输出类似于:

array(2) {
  ["stages"]=>
  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)
}

参见

相关文章
php 核心类 the mongocollection classphp set creates a new set using values in either the current instance or in another set but not in bothphp cubrid 函数 delete an element from set type column using oidphp 多字节字符串 函数 perform a regular expression search and replace with multibyte support using a callbackphp ncurses 函数 delay output on terminal using padding charactersphp pcre 函数 perform a regular expression search and replace using callbacksphp ssh2 函数 authenticate over ssh using a plain passwordphp imagickdraw sets the opacity to use when drawing using the fill color or fill texturephp mongocollection perform an aggregation using the aggregation frameworkphp mongocollection execute an aggregation pipeline command and retrieve results through a cursorphp mongocollection 创建一个数据库引用php mongocollection creates an index on the specified field s if it does not already existphp mongocollection get the write concern for this collectionphp mongocollection performs an operation similar to sql s group by commandphp phar compresses the entire phar archive using gzip or bzip2 compressionphp phar compresses all files in the current phar archive using bzip2 compressionphp pharfileinfo compresses the current phar entry within the phar using bzip2 compressionphp pharfileinfo compresses the current phar entry within the phar using gz compressionphp solrquery returns the maximum number of characters from a field when using the regex fragmenterphp ziparchive delete an entry in the archive using its name
关注编程学问公众号