$sum, $avg, $min, $max : agrégation numérique
Les apprenants calculeront des totaux, des moyennes et des valeurs extrêmes dans $group, et utiliseront également ces accumulateurs comme opérateurs d’expression dans $project.
$sum, $avg, $min, $max : agrégation numérique est une leçon MongoDB Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage MongoDB Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours MongoDB Academy comprend 4 leçons au total.
Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.
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.
Questions Fréquemment Posées
La leçon « $sum, $avg, $min, $max : agrégation numérique » est-elle gratuite ?
Oui — le texte complet de « $sum, $avg, $min, $max : agrégation numérique » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours MongoDB Academy, passe à CoddyKit PRO. Le cours MongoDB Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « $sum, $avg, $min, $max : agrégation numérique » ?
Les apprenants calculeront des totaux, des moyennes et des valeurs extrêmes dans $group, et utiliseront également ces accumulateurs comme opérateurs d’expression dans $project. Tu pratiques MongoDB Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer MongoDB Academy ?
Aucune expérience préalable n'est requise. MongoDB Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « $sum, $avg, $min, $max : agrégation numérique » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon MongoDB Academy ?
Oui. Chaque leçon MongoDB Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- $sum, $avg, $min, $max : agrégation numérique
- $push et $addToSet : construire des tableaux dans les groupes
- Accumulateurs $first, $last et $top/$bottom
- Fonctions de fenêtre avec $setWindowFields