$sum, $avg, $min, $max: Agregasi Numerik
Peserta didik akan menghitung total, rata-rata, dan nilai ekstrem dalam $group, serta menggunakan akumulator ini sebagai operator ekspresi dalam $project.
$sum, $avg, $min, $max: Agregasi Numerik adalah pelajaran MongoDB Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar MongoDB Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus MongoDB Academy mencakup 4 pelajaran total.
Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.
Numeric Accumulators in $group
MongoDB's $group stage uses accumulators to compute aggregate values from grouped documents. The most fundamental numeric accumulators are $sum, $avg, $min, and $max. Each accumulator processes all documents in a group and produces a single output value. These operators form the backbone of analytics pipelines.
Using $sum to Count and Total
The $sum accumulator has two common uses: counting documents by passing a literal value like 1, and summing a field by referencing a numeric field. When a field is missing or null, $sum treats it as zero. This makes it safe to use on optional numeric fields without extra null-checks.
db.orders.aggregate([
{
$group: {
_id: '$status',
orderCount: { $sum: 1 },
totalRevenue: { $sum: '$amount' }
}
}
])Computing Averages With $avg
The $avg accumulator computes the arithmetic mean of a numeric field across all documents in a group. It automatically ignores documents where the field is missing or null, computing the average only over valid values. This is useful for metrics like average order value or average rating per product.
db.reviews.aggregate([
{
$group: {
_id: '$productId',
averageRating: { $avg: '$rating' },
reviewCount: { $sum: 1 }
}
},
{ $sort: { averageRating: -1 } }
])Finding Extremes With $min and $max
$min and $max return the smallest and largest values in a group respectively. They work on any comparable type—numbers, dates, and strings. A common use case is finding the first and last event times within a session, or the cheapest and most expensive product in a category. They ignore null and missing values.
db.sessions.aggregate([
{
$group: {
_id: '$userId',
firstLogin: { $min: '$timestamp' },
lastLogin: { $max: '$timestamp' },
minSessionDuration: { $min: '$durationSeconds' },
maxSessionDuration: { $max: '$durationSeconds' }
}
}
])Grouping by Null for Global Totals
To compute a single aggregate over the entire collection, set the _id to null. This groups all documents into one bucket. This technique is how you calculate totals, overall averages, and global extremes without segmenting data. Think of it as the MongoDB equivalent of a SQL SELECT SUM(*) FROM orders with no GROUP BY clause.
db.orders.aggregate([
{
$group: {
_id: null,
totalOrders: { $sum: 1 },
grandTotal: { $sum: '$amount' },
averageOrder: { $avg: '$amount' },
minOrder: { $min: '$amount' },
maxOrder: { $max: '$amount' }
}
}
])Using These Accumulators in $project
A lesser-known feature is that $sum, $avg, $min, and $max can also be used as expression operators in $project—not just in $group. In this context, they operate on an array within a single document rather than across multiple documents. This allows you to compute the sum of elements in an embedded array field without a $group stage.
db.carts.aggregate([
{
$project: {
userId: 1,
// Sum elements inside the items array
cartTotal: { $sum: '$items.price' },
maxItemPrice: { $max: '$items.price' },
avgItemPrice: { $avg: '$items.price' }
}
}
])Nested Expressions Inside Accumulators
Accumulators accept any valid expression, not just field references. You can use arithmetic operators, conditional expressions, and even $cond inside an accumulator. This lets you implement conditional sums like 'sum only completed orders' or 'count only high-value transactions' in a single pipeline stage.
db.orders.aggregate([
{
$group: {
_id: '$customerId',
// Only sum orders that are 'completed'
completedRevenue: {
$sum: {
$cond: [
{ $eq: ['$status', 'completed'] },
'$amount',
0
]
}
}
}
}
])Multi-Level Grouping Pipelines
You can chain multiple $group stages to compute multi-level aggregations. A first group computes per-day totals, and a second group computes monthly averages from those daily totals. This pattern is cleaner than doing everything in one stage and makes the pipeline logic easier to reason about.
db.sales.aggregate([
// First group: totals per day
{
$group: {
_id: { year: { $year: '$date' }, month: { $month: '$date' }, day: { $dayOfMonth: '$date' } },
dailyTotal: { $sum: '$amount' }
}
},
// Second group: average daily total per month
{
$group: {
_id: { year: '$_id.year', month: '$_id.month' },
avgDailyRevenue: { $avg: '$dailyTotal' },
totalMonthRevenue: { $sum: '$dailyTotal' }
}
}
])Filtering Before Grouping With $match
Always place a $match stage before $group to filter down to the relevant documents first. This reduces the number of documents the grouping stage must process and, crucially, allows MongoDB to use an index to satisfy the filter. A $match after $group filters group results, which is also useful but does not benefit from indexes.
db.orders.aggregate([
// Filter first — MongoDB can use an index on createdAt
{
$match: {
createdAt: { $gte: new Date('2024-01-01') },
status: 'completed'
}
},
{
$group: {
_id: '$region',
totalRevenue: { $sum: '$amount' },
avgRevenue: { $avg: '$amount' }
}
},
{ $sort: { totalRevenue: -1 } }
])Handling Missing and Null Values
When a field referenced in $sum or $avg is missing or null, the behavior differs slightly. $sum treats missing/null as zero, so all documents contribute to the count. $avg and $min/$max ignore missing/null values entirely—they do not factor into the computation. Understanding this distinction prevents subtle bugs in your analytics queries.
// Consider documents where some lack a 'discount' field
// $sum: missing = 0, so it counts in the total
// $avg: missing fields are ignored, avg is over existing values only
db.orders.aggregate([
{
$group: {
_id: '$category',
totalDiscount: { $sum: '$discount' }, // missing = 0
avgDiscount: { $avg: '$discount' } // missing = ignored
}
}
])Practical Example: Sales Dashboard
Combining $sum, $avg, $min, and $max in one $group stage is a common pattern for dashboard metrics. A single aggregation pipeline can return everything needed to populate a summary card: total orders, revenue, average order value, and the range of order sizes. This avoids multiple round-trips to the database.
db.orders.aggregate([
{ $match: { status: 'completed' } },
{
$group: {
_id: '$category',
totalOrders: { $sum: 1 },
totalRevenue: { $sum: '$amount' },
avgOrderValue: { $avg: '$amount' },
smallestOrder: { $min: '$amount' },
largestOrder: { $max: '$amount' }
}
},
{ $sort: { totalRevenue: -1 } },
{ $limit: 10 }
])Quick Check
Test your understanding of MongoDB & NoSQL Databases concepts from this lesson.
Lesson Recap
In this lesson you learned: $sum totals values and counts documents (missing = 0), $avg/$min/$max ignore missing or null fields, and these accumulators work in both $group (across documents) and $project (within an array). Next up we explore $push and $addToSet for building arrays within groups.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “$sum, $avg, $min, $max: Agregasi Numerik” gratis?
Ya — teks lengkap “$sum, $avg, $min, $max: Agregasi Numerik” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus MongoDB Academy, upgrade ke CoddyKit PRO. Kursus MongoDB Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “$sum, $avg, $min, $max: Agregasi Numerik”?
Peserta didik akan menghitung total, rata-rata, dan nilai ekstrem dalam $group, serta menggunakan akumulator ini sebagai operator ekspresi dalam $project. Kamu berlatih MongoDB Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai MongoDB Academy?
Tidak diperlukan pengalaman sebelumnya. MongoDB Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “$sum, $avg, $min, $max: Agregasi Numerik” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran MongoDB Academy ini?
Ya. Setiap pelajaran MongoDB Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- $sum, $avg, $min, $max: Agregasi Numerik
- $push dan $addToSet: Membangun Array dalam Kelompok
- Akumulator $first, $last, dan $top/$bottom
- Fungsi Jendela dengan $setWindowFields