0Pricing
MongoDB Academy · Lezione

$sum, $avg, $min, $max: aggregazioni numeriche

I partecipanti calcoleranno totali, medie ed estremi all'interno di $group e useranno inoltre questi accumulatori come operatori di espressione in $project.

$sum, $avg, $min, $max: aggregazioni numeriche è una lezione MongoDB Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento MongoDB Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso MongoDB Academy include 4 lezioni in totale.

Parti di questa lezione non sono ancora state tradotte e vengono mostrate in inglese.

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.

Domande Frequenti

La lezione «$sum, $avg, $min, $max: aggregazioni numeriche» è gratuita?

Sì — il testo completo di «$sum, $avg, $min, $max: aggregazioni numeriche» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso MongoDB Academy, passa a CoddyKit PRO. Il corso MongoDB Academy include 4 lezioni in totale.

Cosa imparerò in «$sum, $avg, $min, $max: aggregazioni numeriche»?

I partecipanti calcoleranno totali, medie ed estremi all'interno di $group e useranno inoltre questi accumulatori come operatori di espressione in $project. Eserciti MongoDB Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare MongoDB Academy?

Non è richiesta alcuna esperienza precedente. MongoDB Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «$sum, $avg, $min, $max: aggregazioni numeriche»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione MongoDB Academy?

Sì. Ogni lezione MongoDB Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. $sum, $avg, $min, $max: aggregazioni numeriche
  2. $push e $addToSet: creare array nei gruppi
  3. Accumulatori $first, $last e $top/$bottom
  4. Funzioni finestra con $setWindowFields
← Torna a MongoDB Academy