Result sets can be grouped in order to apply accumulators and aggregate data from accessible documents.
The $group stage takes the following form:
{"$group": {"_id": <expression>, <property>: { <accumulator1> : <expression> }, <property>: { <accumulator2> : <expression> },... }}
For available accumulators, see Accumulator Operators.
The _id
property is your grouping expression and is required. The _id
can be null, it can be a single property or a combination of properties and group expressions. When you specify an _id
of null
, you will group together all of the documents in the result set. This is helpful for calculating accumulated values for all of the documents, for example when calculating a cont of the total number of documents in your result. When the _id
is null, it is not included in the result set.
Examples
In the following example, we aggregate a custom c_patient
object with a two-stage pipeline. The first stage is a $match
that filters the documents down to patients with a gender: 'f'
. Those documents are then passed into the $group
stage where we count all of the documents in the result set and return a count
property. Because we pass null
for the grouping _id
, we can calculate an accumulation for the entire result set.
GET /c_patients?pipeline=[{"$match": {"gender": "f"}},{"$group": {"_id": null, "count": {"$count": "_id"}}}]
{
"data": [
{
"count": 359
}
],
"hasMore": false,
"object": "list"
}
The following example is a single-stage $group
on the connections
object. The grouping is by the connections' context._id
. Then, a count is calculated for each context grouping and returned in total
properties.
GET /connections?pipeline=[{"$group": {"_id": "context._id", "total": {"$count": "_id"}}}, {"$sort": {"total": 1}}]
{
"data": [
{
"_id": "507f1f77bcf86cd799439011",
"total": 2
},
{
"_id": "55ff9db67a00a89c14aa31a6",
"total": 4
},
{
"_id": "4d656461626c6552756c656b",
"total": 12
},
{
"_id": "507f191e810c19729de860ea",
"total": 52
}
],
"hasMore": false,
"object": "list"
}