Bird
Raised Fist0
MongoDBquery~10 mins

$avg accumulator in MongoDB - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - $avg accumulator
Start with documents
↓
Group documents by key
↓
Extract values of field to average
↓
Sum values and count documents
↓
Calculate average = sum / count
↓
Output average per group
The $avg accumulator groups documents, sums values, counts them, then divides sum by count to get average.
Execution Sample
MongoDB
db.sales.aggregate([
  { $group: { _id: "$item", avgQuantity: { $avg: "$quantity" } } }
])
Calculate average quantity sold per item from sales documents.
Execution Table
StepDocumentGroup _idQuantitySumCountAverage
1{item: 'apple', quantity: 5}apple5515
2{item: 'banana', quantity: 3}banana3313
3{item: 'apple', quantity: 7}apple71226
4{item: 'banana', quantity: 2}banana2522.5
5{item: 'apple', quantity: 4}apple41635.33
6No more documents-----
💡 All documents processed; averages computed as sum/count per group.
Variable Tracker
VariableStartAfter 1After 2After 3After 4After 5Final
sum_apple05512121616
count_apple0112233
avg_apple-55665.335.33
sum_banana0033555
count_banana0011222
avg_banana--332.52.52.5
Key Moments - 2 Insights
Why does the average for 'apple' change after each document?
Because each new 'apple' document updates sum and count, changing average as sum/count (see execution_table rows 1,3,5).
What happens if a group has only one document?
The average equals that document's value since sum and count are both 1 (see banana at step 2).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 4, what is the average quantity for 'banana'?
A3
B2.5
C5
D1
💡 Hint
Check the 'Average' column for 'banana' at step 4 in execution_table.
At which step does the average for 'apple' first become less than 6?
AStep 5
BStep 3
CStep 1
DStep 2
💡 Hint
Look at the 'Average' values for 'apple' in execution_table rows 3 and 5.
If a new document {item: 'banana', quantity: 5} is added after step 5, what happens to banana's average?
AIt stays the same
BIt decreases
CIt increases
DIt becomes zero
💡 Hint
Adding quantity 5 increases sum and count for banana, so average = new sum / new count.
Concept Snapshot
$avg accumulator in MongoDB groups documents by a key.
It sums the values of a field and counts documents.
Then it divides sum by count to get average.
Syntax: { $avg: "$fieldName" } inside $group stage.
Useful to find average values per group in collections.
Full Transcript
The $avg accumulator in MongoDB is used inside an aggregation pipeline's $group stage. It groups documents by a specified key, then calculates the average of a numeric field within each group. This happens by summing the field values and counting the documents, then dividing sum by count. For example, grouping sales by item and averaging quantity sold per item. The execution table shows step-by-step how each document updates sums, counts, and averages. Beginners often wonder why averages change after each document; it's because sums and counts update incrementally. Also, if a group has only one document, average equals that document's value. Adding more documents changes sums and counts, thus changing averages accordingly.

Practice

(1/5)
1. What does the $avg accumulator do in a MongoDB aggregation pipeline?
easy
A. Calculates the average value of numeric fields in grouped documents
B. Counts the total number of documents in a collection
C. Finds the maximum value in a group of documents
D. Sorts documents in ascending order

Solution

  1. Step 1: Understand the purpose of $avg

    The $avg accumulator is designed to calculate the mean (average) of numeric values within grouped documents in an aggregation pipeline.
  2. Step 2: Compare with other accumulators

    Other accumulators like $sum, $max, and $count perform different tasks, so $avg specifically calculates averages.
  3. Final Answer:

    Calculates the average value of numeric fields in grouped documents -> Option A
  4. Quick Check:

    $avg = average calculation [OK]
Hint: Remember: $avg means average, not count or max [OK]
Common Mistakes:
  • Confusing $avg with $sum or $count
  • Thinking $avg sorts data
  • Assuming $avg works outside aggregation
2. Which of the following is the correct syntax to calculate the average of the field score in a MongoDB aggregation $group stage?
easy
A. { $group: { _id: null, avgScore: { $average: "$score" } } }
B. { $group: { _id: null, avgScore: { $avg: "$score" } } }
C. { $group: { _id: null, avgScore: { avg: "$score" } } }
D. { $group: { _id: null, avgScore: { $sum: "$score" } } }

Solution

  1. Step 1: Identify the correct accumulator name

    The correct MongoDB accumulator for average is $avg, not $average or avg.
  2. Step 2: Check the syntax structure

    The syntax requires the field name as a string with a $ prefix inside $avg, and the whole inside a $group stage with an _id.
  3. Final Answer:

    { $group: { _id: null, avgScore: { $avg: "$score" } } } -> Option B
  4. Quick Check:

    Correct syntax uses $avg with field string [OK]
Hint: Use $avg exactly, with field as "$fieldName" [OK]
Common Mistakes:
  • Using $average instead of $avg
  • Omitting quotes around field name
  • Using $sum instead of $avg
3. Given the collection students with documents:
{ "name": "Alice", "score": 80 }, { "name": "Bob", "score": 90 }, { "name": "Charlie", "score": 70 }

What will be the output of this aggregation?
[{ $group: { _id: null, averageScore: { $avg: "$score" } } }]
medium
A. [{ "_id": null, "averageScore": 240 }]
B. [{ "_id": null, "averageScore": 70 }]
C. [{ "_id": null, "averageScore": 80 }]
D. [{ "_id": null, "averageScore": 90 }]

Solution

  1. Step 1: Calculate the sum of scores

    Sum = 80 + 90 + 70 = 240.
  2. Step 2: Calculate the average

    Average = 240 / 3 = 80.
  3. Final Answer:

    [{ "_id": null, "averageScore": 80 }] -> Option C
  4. Quick Check:

    Average of 80, 90, 70 = 80 [OK]
Hint: Add all scores, divide by count for average [OK]
Common Mistakes:
  • Using sum instead of average
  • Picking minimum or maximum score
  • Forgetting to divide by number of documents
4. Consider this aggregation pipeline:
[{ $group: { _id: "$class", avgScore: { $avg: score } } }]

What is the error in this pipeline?
medium
A. Cannot use $avg inside $group
B. Missing $match stage before $group
C. The _id field cannot be "$class"
D. Field name 'score' should be a string with $ prefix: "$score"

Solution

  1. Step 1: Check the field reference inside $avg

    The field name must be a string with a $ prefix, so it should be "$score", not score.
  2. Step 2: Validate other parts of the pipeline

    Using "$class" as _id is valid, and $avg is allowed inside $group. $match is optional.
  3. Final Answer:

    Field name 'score' should be a string with $ prefix: "$score" -> Option D
  4. Quick Check:

    Field names in $avg need "$field" format [OK]
Hint: Always quote field names with $ in accumulators [OK]
Common Mistakes:
  • Using unquoted field names inside $avg
  • Thinking $match is mandatory before $group
  • Believing _id cannot be a field name
5. You have a collection sales with documents:
{ "region": "North", "amount": 100 }, { "region": "South", "amount": 200 }, { "region": "North", "amount": 300 }, { "region": "South", "amount": 400 }

Write an aggregation pipeline to find the average sales amount per region and identify the region with the highest average sales.
hard
A. [{ $group: { _id: "$region", avgAmount: { $avg: "$amount" } } }, { $sort: { avgAmount: -1 } }, { $limit: 1 }]
B. [{ $group: { _id: "$region", avgAmount: { $sum: "$amount" } } }, { $sort: { avgAmount: 1 } }]
C. [{ $group: { _id: "$region", avgAmount: { $avg: "$amount" } } }, { $match: { avgAmount: { $gt: 300 } } }]
D. [{ $group: { _id: "$region", avgAmount: { $avg: "$amount" } } }, { $sort: { avgAmount: 1 } }, { $limit: 1 }]

Solution

  1. Step 1: Group by region and calculate average

    Use $group with _id: "$region" and $avg: "$amount" to get average sales per region.
  2. Step 2: Sort descending by average and limit to top

    Sort by avgAmount descending (-1) to get highest average first, then limit to 1 document.
  3. Final Answer:

    [{ $group: { _id: "$region", avgAmount: { $avg: "$amount" } } }, { $sort: { avgAmount: -1 } }, { $limit: 1 }] -> Option A
  4. Quick Check:

    Group, sort descending, limit 1 = highest average [OK]
Hint: Group by region, avg, sort desc, limit 1 for highest [OK]
Common Mistakes:
  • Using $sum instead of $avg for average
  • Sorting ascending to get highest average
  • Not limiting results to top 1
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard