MongoDB Academy · レッスン

$sum、$avg、$min、$max:数値の集約

$group内で合計、平均、最大値、最小値を計算し、$projectではこれらの累計演算子を式演算子として使用します。

レッスン 1/413 ステップ

「$sum、$avg、$min、$max:数値の集約」はCoddyKit上の無料MongoDB Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはMongoDB Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 MongoDB Academyコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

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.

無料で開始

AI チューターと学ぶ JavaScript — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「$sum、$avg、$min、$max:数値の集約」レッスンは無料ですか?

はい。「$sum、$avg、$min、$max:数値の集約」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、MongoDB Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 MongoDB Academyコースには全4レッスンが含まれています。

「$sum、$avg、$min、$max:数値の集約」で何を学びますか?

$group内で合計、平均、最大値、最小値を計算し、$projectではこれらの累計演算子を式演算子として使用します。 ブラウザで直接実行するハンズオンコードでMongoDB Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

MongoDB Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのMongoDB Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「$sum、$avg、$min、$max:数値の集約」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このMongoDB Academyレッスンでコードを書いて実行できますか?

はい。すべてのMongoDB Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. $sum、$avg、$min、$max:数値の集約
  2. $pushと$addToSet:グループ内での配列の構築
  3. $first、$last、$top/$bottom累計演算子
  4. $setWindowFieldsによるウィンドウ関数
← MongoDB Academyに戻る