<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Performs an operation similar to SQL's GROUP BY command</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="mongocollection.getslaveokay.html">MongoCollection::getSlaveOkay</a></div> <div class="next" style="text-align: right; float: right;"><a href="mongocollection.insert.html">MongoCollection::insert</a></div> <div class="up"><a href="class.mongocollection.html">MongoCollection</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="mongocollection.group" class="refentry"> <div class="refnamediv"> <h1 class="refname">MongoCollection::group</h1> <p class="verinfo">(PECL mongo >=0.9.2)</p><p class="refpurpose"><span class="refname">MongoCollection::group</span> — <span class="dc-title">Performs an operation similar to SQL's GROUP BY command</span></p> </div> <div class="refsect1 description" id="refsect1-mongocollection.group-description"> <h3 class="title">Description</h3> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">array</span> <span class="methodname"><strong>MongoCollection::group</strong></span> ( <span class="methodparam"><span class="type"><a href="language.pseudo-types.html#language.types.mixed" class="type mixed">mixed</a></span> <code class="parameter">$keys</code></span> , <span class="methodparam"><span class="type">array</span> <code class="parameter">$initial</code></span> , <span class="methodparam"><span class="type"><a href="class.mongocode.html" class="type MongoCode">MongoCode</a></span> <code class="parameter">$reduce</code></span> [, <span class="methodparam"><span class="type">array</span> <code class="parameter">$options</code><span class="initializer"> = array()</span></span> ] )</div> </div> <div class="refsect1 parameters" id="refsect1-mongocollection.group-parameters"> <h3 class="title">Parameters</h3> <p class="para"> <dl> <dt> <span class="term"> <em><code class="parameter">keys</code></em> </span> <dd> <p class="para"> Fields to group by. If an array or non-code object is passed, it will be the key used to group results. </p> <p class="para">1.0.4+: If <em><code class="parameter">keys</code></em> is an instance of <a href="class.mongocode.html" class="classname">MongoCode</a>, <em><code class="parameter">keys</code></em> will be treated as a function that returns the key to group by (see the "Passing a <em><code class="parameter">keys</code></em> function" example below). </p> </dd> </dt> <dt> <span class="term"> <em><code class="parameter">initial</code></em> </span> <dd> <p class="para"> Initial value of the aggregation counter object. </p> </dd> </dt> <dt> <span class="term"> <em><code class="parameter">reduce</code></em> </span> <dd> <p class="para"> A function that takes two arguments (the current document and the aggregation to this point) and does the aggregation. </p> </dd> </dt> <dt> <span class="term"> <em><code class="parameter">options</code></em> </span> <dd> <p class="para"> Optional parameters to the group command. Valid options include: </p> <ul class="itemizedlist"> <li class="listitem"> <p class="para"> <em>"condition"</em> </p> <p class="para"> Criteria for including a document in the aggregation. </p> </li> <li class="listitem"> <p class="para"> <em>"finalize"</em> </p> <p class="para"> Function called once per unique key that takes the final output of the reduce function. </p> </li> </ul> </dd> </dt> </dl> </p> </div> <div class="refsect1 returnvalues" id="refsect1-mongocollection.group-returnvalues"> <h3 class="title">Return Values</h3> <p class="para"> Returns an array containing the result. </p> </div> <div class="refsect1 changelog" id="refsect1-mongocollection.group-changelog"> <h3 class="title">Changelog</h3> <p class="para"> <table class="doctable informaltable"> <thead> <tr> <th>Version</th> <th>Description</th> </tr> </thead> <tbody class="tbody"> <tr> <td>1.2.11</td> <td> Emits <strong><code>E_DEPRECATED</code></strong> when <em><code class="parameter">options</code></em> is <span class="type"><span class="type scalar">scalar</span></span>. </td> </tr> </tbody> </table> </p> </div> <div class="refsect1 examples" id="refsect1-mongocollection.group-examples"> <h3 class="title">Examples</h3> <div class="example" id="example-1459"> <p><strong>Example #1 <span class="function"><strong>MongoCollection::group()</strong></span> example</strong></p> <div class="example-contents"><p> This groups documents by category and creates a list of names within that category. </p></div> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /><br />$collection</span><span style="color: #007700">-></span><span style="color: #0000BB">insert</span><span style="color: #007700">(array(</span><span style="color: #DD0000">"category" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"fruit"</span><span style="color: #007700">, </span><span style="color: #DD0000">"name" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"apple"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$collection</span><span style="color: #007700">-></span><span style="color: #0000BB">insert</span><span style="color: #007700">(array(</span><span style="color: #DD0000">"category" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"fruit"</span><span style="color: #007700">, </span><span style="color: #DD0000">"name" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"peach"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$collection</span><span style="color: #007700">-></span><span style="color: #0000BB">insert</span><span style="color: #007700">(array(</span><span style="color: #DD0000">"category" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"fruit"</span><span style="color: #007700">, </span><span style="color: #DD0000">"name" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"banana"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$collection</span><span style="color: #007700">-></span><span style="color: #0000BB">insert</span><span style="color: #007700">(array(</span><span style="color: #DD0000">"category" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"veggie"</span><span style="color: #007700">, </span><span style="color: #DD0000">"name" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"corn"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$collection</span><span style="color: #007700">-></span><span style="color: #0000BB">insert</span><span style="color: #007700">(array(</span><span style="color: #DD0000">"category" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"veggie"</span><span style="color: #007700">, </span><span style="color: #DD0000">"name" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"broccoli"</span><span style="color: #007700">));<br /><br /></span><span style="color: #0000BB">$keys </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"category" </span><span style="color: #007700">=> </span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$initial </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"items" </span><span style="color: #007700">=> array());<br /><br /></span><span style="color: #0000BB">$reduce </span><span style="color: #007700">= </span><span style="color: #DD0000">"function (obj, prev) { prev.items.push(obj.name); }"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$g </span><span style="color: #007700">= </span><span style="color: #0000BB">$collection</span><span style="color: #007700">-></span><span style="color: #0000BB">group</span><span style="color: #007700">(</span><span style="color: #0000BB">$keys</span><span style="color: #007700">, </span><span style="color: #0000BB">$initial</span><span style="color: #007700">, </span><span style="color: #0000BB">$reduce</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #0000BB">json_encode</span><span style="color: #007700">(</span><span style="color: #0000BB">$g</span><span style="color: #007700">[</span><span style="color: #DD0000">'retval'</span><span style="color: #007700">]);<br /><br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output something similar to:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> [{"category":"fruit","items":["apple","peach","banana"]},{"category":"veggie","items":["corn","broccoli"]}] </pre></div> </div> </div> <div class="example" id="example-1460"> <p><strong>Example #2 <span class="function"><strong>MongoCollection::group()</strong></span> example</strong></p> <div class="example-contents"><p> This example doesn't use any key, so every document will be its own group. It also uses a condition: only documents that match this condition will be processed by the grouping function. </p></div> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /><br />$collection</span><span style="color: #007700">-></span><span style="color: #0000BB">save</span><span style="color: #007700">(array(</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=> </span><span style="color: #0000BB">2</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$collection</span><span style="color: #007700">-></span><span style="color: #0000BB">save</span><span style="color: #007700">(array(</span><span style="color: #DD0000">"b" </span><span style="color: #007700">=> </span><span style="color: #0000BB">5</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$collection</span><span style="color: #007700">-></span><span style="color: #0000BB">save</span><span style="color: #007700">(array(</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=> </span><span style="color: #0000BB">1</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// use all fields<br /></span><span style="color: #0000BB">$keys </span><span style="color: #007700">= array();<br /><br /></span><span style="color: #FF8000">// set intial values<br /></span><span style="color: #0000BB">$initial </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"count" </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// JavaScript function to perform<br /></span><span style="color: #0000BB">$reduce </span><span style="color: #007700">= </span><span style="color: #DD0000">"function (obj, prev) { prev.count++; }"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// only use documents where the "a" field is greater than 1<br /></span><span style="color: #0000BB">$condition </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'condition' </span><span style="color: #007700">=> array(</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=> array( </span><span style="color: #DD0000">'$gt' </span><span style="color: #007700">=> </span><span style="color: #0000BB">1</span><span style="color: #007700">)));<br /><br /></span><span style="color: #0000BB">$g </span><span style="color: #007700">= </span><span style="color: #0000BB">$collection</span><span style="color: #007700">-></span><span style="color: #0000BB">group</span><span style="color: #007700">(</span><span style="color: #0000BB">$keys</span><span style="color: #007700">, </span><span style="color: #0000BB">$initial</span><span style="color: #007700">, </span><span style="color: #0000BB">$reduce</span><span style="color: #007700">, </span><span style="color: #0000BB">$condition</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$g</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output something similar to:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> array(4) { ["retval"]=> array(1) { [0]=> array(1) { ["count"]=> float(1) } } ["count"]=> float(1) ["keys"]=> int(1) ["ok"]=> float(1) } </pre></div> </div> </div> <div class="example" id="example-1461"> <p><strong>Example #3 Passing a <em><code class="parameter">keys</code></em> function</strong></p> <div class="example-contents"><p> If you want to group by something other than a field name, you can pass a function as the first parameter of <span class="function"><strong>MongoCollection::group()</strong></span> and it will be run against each document. The return value of the function will be used as its grouping value. </p></div> <div class="example-contents"><p> This example demonstrates grouping by the num field modulo 4. </p></div> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /><br />$c</span><span style="color: #007700">-></span><span style="color: #0000BB">group</span><span style="color: #007700">(new </span><span style="color: #0000BB">MongoCode</span><span style="color: #007700">(</span><span style="color: #DD0000">'function(doc) { return {mod : doc.num % 4}; }'</span><span style="color: #007700">),<br /> array(</span><span style="color: #DD0000">"count" </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">),<br /> new </span><span style="color: #0000BB">MongoCode</span><span style="color: #007700">(</span><span style="color: #DD0000">'function(current, total) { total.count++; }'</span><span style="color: #007700">));<br /><br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> </div> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="mongocollection.getslaveokay.html">MongoCollection::getSlaveOkay</a></div> <div class="next" style="text-align: right; float: right;"><a href="mongocollection.insert.html">MongoCollection::insert</a></div> <div class="up"><a href="class.mongocollection.html">MongoCollection</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>