Skip to content

$group & Accumulators

$group groups documents by a key and calculates aggregate values.

{
$group: {
_id: "$fieldToGroupBy",
outputField: { $accumulator: "$valueField" }
}
}
AccumulatorMeaning
$sumAdds values or counts documents
$avgCalculates average
$minFinds minimum
$maxFinds maximum
$pushAdds values to an array
$addToSetAdds unique values to an array
$firstFirst value in group
$lastLast value in group
db.orders.aggregate([
{
$group: {
_id: "$status",
count: { $sum: 1 }
}
}
])
db.orders.aggregate([
{ $match: { status: "completed" } },
{
$group: {
_id: "$userId",
totalSpent: { $sum: "$totalAmount" },
averageOrderValue: { $avg: "$totalAmount" },
orderCount: { $sum: 1 },
highestOrder: { $max: "$totalAmount" }
}
},
{ $sort: { totalSpent: -1 } }
])
db.orders.aggregate([
{
$group: {
_id: {
year: { $year: "$createdAt" },
month: { $month: "$createdAt" },
status: "$status"
},
count: { $sum: 1 },
revenue: { $sum: "$totalAmount" }
}
}
])

Use _id: null when you want one result for the whole collection.

db.orders.aggregate([
{
$group: {
_id: null,
totalRevenue: { $sum: "$totalAmount" },
totalOrders: { $sum: 1 }
}
}
])

$push keeps duplicates:

{ $group: { _id: "$category", brands: { $push: "$brand" } } }

$addToSet keeps unique values:

{ $group: { _id: "$category", brands: { $addToSet: "$brand" } } }