Bird
Raised Fist0
MongoDBquery~20 mins

$group stage for aggregation in MongoDB - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
MongoDB Aggregation Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
Output of $group with sum accumulator
Given the collection sales with documents:
{ "item": "apple", "qty": 5 }
{ "item": "banana", "qty": 10 }
{ "item": "apple", "qty": 15 }

What is the output of this aggregation?
db.sales.aggregate([{ $group: { _id: "$item", totalQty: { $sum: "$qty" } } }])
MongoDB
db.sales.aggregate([{ $group: { _id: "$item", totalQty: { $sum: "$qty" } } }])
A[{ "_id": "apple", "totalQty": 20 }, { "_id": "banana", "totalQty": 10 }]
B[{ "_id": "apple", "totalQty": 5 }, { "_id": "banana", "totalQty": 10 }, { "_id": "apple", "totalQty": 15 }]
C[{ "_id": null, "totalQty": 30 }]
D[{ "_id": "apple", "totalQty": 15 }, { "_id": "banana", "totalQty": 10 }]
Attempts:
2 left
💡 Hint
Think about grouping by the item name and summing quantities for each group.
📝 Syntax
intermediate
1:30remaining
Identify the syntax error in $group stage
Which option contains a syntax error in the $group stage of this aggregation pipeline?
db.orders.aggregate([{ $group: { _id: "$customer", total: { $sum: "$amount" } } }])
A{ $group: { _id: "$customer", total: { $sum: "$amount" } } }
B{ $group: { _id: "$customer", total: { $sum: amount } } }
C} } } "tnuoma$" :mus$ { :latot ,"remotsuc$" :di_ { :puorg$ {
D $group: { _id: "$customer", total: { $sum: "$amount" } } }
Attempts:
2 left
💡 Hint
Check if the field names are properly quoted as strings.
❓ query_result
advanced
2:30remaining
Output of $group with multiple accumulators
Given the collection products with documents:
{ "category": "fruit", "price": 10 }
{ "category": "fruit", "price": 15 }
{ "category": "vegetable", "price": 20 }

What is the output of this aggregation?
db.products.aggregate([{ $group: { _id: "$category", count: { $sum: 1 }, avgPrice: { $avg: "$price" } } }])
MongoDB
db.products.aggregate([{ $group: { _id: "$category", count: { $sum: 1 }, avgPrice: { $avg: "$price" } } }])
A[{ "_id": "fruit", "count": 2, "avgPrice": 12.5 }, { "_id": "vegetable", "count": 1, "avgPrice": 20 }]
B[{ "_id": "fruit", "count": 1, "avgPrice": 12.5 }, { "_id": "vegetable", "count": 1, "avgPrice": 20 }]
C[{ "_id": "fruit", "count": 2, "avgPrice": 25 }, { "_id": "vegetable", "count": 1, "avgPrice": 20 }]
D[{ "_id": null, "count": 3, "avgPrice": 15 }]
Attempts:
2 left
💡 Hint
Count counts documents per group, avgPrice averages the price field per group.
🔧 Debug
advanced
2:00remaining
Why does this $group aggregation return empty results?
Consider this aggregation on collection logs:
db.logs.aggregate([{ $group: { _id: "$level", total: { $sum: "$count" } } }])

But the output is an empty array. The documents look like:
{ "level": "error", "count": 5 }
{ "level": "info", "count": 3 }

What is the most likely reason for empty output?
AThe field "count" does not exist in documents, so $sum returns null and no groups form.
BThe aggregation pipeline is missing a $match stage to filter documents.
CThe field "count" is a string, so $sum fails silently and returns empty.
DThe aggregation is correct; empty output means no documents in collection.
Attempts:
2 left
💡 Hint
Consider if there are actually documents in the collection matching the pipeline.
🧠 Conceptual
expert
1:30remaining
Understanding $group _id field behavior
In MongoDB aggregation, what happens if you set _id to null in the $group stage?

Choose the correct explanation:
ADocuments are grouped by a field named "null", which usually does not exist, so output is empty.
BEach document is grouped by its own _id field, so output has same number of documents as input.
CAll documents are grouped into a single group, so the output has one document aggregating all input documents.
DThe aggregation fails with an error because _id cannot be null in $group.
Attempts:
2 left
💡 Hint
Think about grouping all documents together regardless of any field.

Practice

(1/5)
1. What is the main purpose of the $group stage in a MongoDB aggregation pipeline?
easy
A. To project specific fields from documents
B. To filter documents based on a condition
C. To sort documents in ascending or descending order
D. To group documents by a specified key and perform calculations on each group

Solution

  1. Step 1: Understand the role of $group

    The $group stage collects documents into groups based on a key defined in the _id field.
  2. Step 2: Identify what $group does with groups

    It allows performing calculations like sum, count, or average on each group.
  3. Final Answer:

    To group documents by a specified key and perform calculations on each group -> Option D
  4. Quick Check:

    $group groups and calculates [OK]
Hint: Remember: $group always groups and aggregates [OK]
Common Mistakes:
  • Confusing $group with $match for filtering
  • Thinking $group sorts documents
  • Assuming $group projects fields without grouping
2. Which of the following is the correct syntax to group documents by the field category and count the number of documents in each group?
easy
A. { $group: { category: "$category", count: { $sum: 1 } } }
B. { $group: { _id: "$category", count: { $sum: 1 } } }
C. { $group: { _id: "$category", count: { $count: 1 } } }
D. { $group: { _id: "$category", count: { $add: 1 } } }

Solution

  1. Step 1: Identify the grouping key field

    The grouping key must be assigned to _id, so _id: "$category" is correct.
  2. Step 2: Use the correct accumulator for counting

    Counting documents uses $sum: 1 to add 1 for each document in the group.
  3. Final Answer:

    { $group: { _id: "$category", count: { $sum: 1 } } } -> Option B
  4. Quick Check:

    Group key in _id and count with $sum: 1 [OK]
Hint: Always use _id for group key and $sum: 1 to count [OK]
Common Mistakes:
  • Using field name instead of _id for grouping key
  • Using $count instead of $sum for counting
  • Using $add which is not an accumulator
3. Given the collection documents:
{ "category": "A", "value": 10 }
{ "category": "B", "value": 20 }
{ "category": "A", "value": 15 }

What will be the output of this aggregation?
[{ $group: { _id: "$category", total: { $sum: "$value" } } }]
medium
A. [{ "_id": "A", "total": 25 }, { "_id": "B", "total": 20 }]
B. [{ "_id": "A", "total": 10 }, { "_id": "B", "total": 20 }, { "_id": "A", "total": 15 }]
C. [{ "_id": "A", "total": 15 }, { "_id": "B", "total": 20 }]
D. [{ "_id": null, "total": 45 }]

Solution

  1. Step 1: Group documents by category

    Documents with category "A" are grouped together, and category "B" separately.
  2. Step 2: Sum the value fields in each group

    For category "A": 10 + 15 = 25; for category "B": 20.
  3. Final Answer:

    [{ "_id": "A", "total": 25 }, { "_id": "B", "total": 20 }] -> Option A
  4. Quick Check:

    Sum values per category = correct totals [OK]
Hint: Sum values grouped by _id key field [OK]
Common Mistakes:
  • Expecting separate documents without grouping
  • Summing incorrectly or ignoring grouping
  • Using _id: null which groups all documents together
4. Identify the error in this aggregation pipeline stage:
{ $group: { category: "$category", total: { $sum: "$amount" } } }
medium
A. Field names should not be in quotes
B. Incorrect use of $sum operator
C. Missing _id field for grouping key
D. Aggregation pipeline stage must be an array

Solution

  1. Step 1: Check for required _id field in $group

    The _id field is mandatory to specify the grouping key.
  2. Step 2: Verify other syntax elements

    The $sum operator and field references are correct; only _id is missing.
  3. Final Answer:

    Missing _id field for grouping key -> Option C
  4. Quick Check:

    _id is required in $group [OK]
Hint: Always include _id in $group stage [OK]
Common Mistakes:
  • Omitting the _id field
  • Confusing field names with grouping key
  • Thinking $sum needs special syntax
5. You have a collection of sales documents with fields store, item, and quantity. You want to find the total quantity sold per store, but only for stores where the total quantity exceeds 100. Which aggregation pipeline correctly achieves this?
hard
A. [{ $group: { _id: "$store", totalQuantity: { $sum: "$quantity" } } }, { $match: { totalQuantity: { $gt: 100 } } }]
B. [{ $match: { quantity: { $gt: 100 } } }, { $group: { _id: "$store", totalQuantity: { $sum: "$quantity" } } }]
C. [{ $group: { _id: "$store", totalQuantity: { $sum: "$quantity" } } }, { $match: { _id: { $gt: 100 } } }]
D. [{ $group: { _id: "$store", totalQuantity: { $sum: "$quantity" } } }, { $sort: { totalQuantity: -1 } }]

Solution

  1. Step 1: Group by store and sum quantity

    The $group stage groups documents by store and calculates total quantity sold per store.
  2. Step 2: Filter groups where total quantity > 100

    The $match stage after grouping filters groups with totalQuantity greater than 100.
  3. Final Answer:

    [{ $group: { _id: "$store", totalQuantity: { $sum: "$quantity" } } }, { $match: { totalQuantity: { $gt: 100 } } }] -> Option A
  4. Quick Check:

    Group then filter by aggregated field [OK]
Hint: Filter after grouping using $match on aggregated fields [OK]
Common Mistakes:
  • Filtering before grouping which filters documents, not groups
  • Filtering on _id instead of aggregated field
  • Using $sort instead of filtering
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