What if you could get many answers from your data in one simple step, without extra work or mistakes?
Why $facet for multiple pipelines in MongoDB? - Purpose & Use Cases
Imagine you have a big box of mixed fruits and you want to sort them into apples, oranges, and bananas separately by hand. You try to count and organize each fruit type one by one, writing down the totals on paper.
Doing this by hand is slow and tiring. You might lose track, make counting mistakes, or mix fruits up. Also, if you want to find more details like the biggest apple or the average size of bananas, it becomes even more complicated and error-prone.
The $facet stage in MongoDB lets you run multiple sorting and counting tasks at the same time on the same data. It's like having several helpers who each focus on one fruit type and give you all the results together quickly and accurately.
db.fruits.find({ type: 'apple' }).count()
db.fruits.find({ type: 'orange' }).count()
db.fruits.find({ type: 'banana' }).count()db.fruits.aggregate([
{ $facet: {
apples: [{ $match: { type: 'apple' } }, { $count: 'count' }],
oranges: [{ $match: { type: 'orange' } }, { $count: 'count' }],
bananas: [{ $match: { type: 'banana' } }, { $count: 'count' }]
}
}
])It enables you to get multiple detailed summaries from the same data in one fast, organized step.
A store manager wants to see how many apples, oranges, and bananas were sold today, along with the average price for each fruit type, all in one report without running separate queries.
Manual counting and sorting is slow and error-prone.
$facet runs multiple data pipelines at once on the same dataset.
This saves time and gives organized, detailed results in one query.
Practice
$facet stage do in a MongoDB aggregation pipeline?Solution
Step 1: Understand the purpose of
$facet$facetallows running multiple aggregation pipelines on the same input data simultaneously.Step 2: Identify the output structure
The output is a single document containing separate arrays for each pipeline's results.Final Answer:
Runs multiple pipelines on the same input data and returns results in one document. -> Option DQuick Check:
$facet= multiple pipelines, one output document [OK]
$facet runs many pipelines at once [OK]- Thinking
$facetfilters or sorts data - Confusing
$facetwith$lookup - Assuming it returns multiple documents instead of one
$facet in a MongoDB aggregation pipeline?Solution
Step 1: Recall
$facetsyntax$facetexpects an object where each key is a pipeline name and the value is an array of pipeline stages.Step 2: Check each option
{ $facet: { pipeline1: [ { $match: {} } ], pipeline2: [ { $group: {} } ] } } correctly uses an object with arrays of stages. Options A, C, and D misuse arrays or objects for stages.Final Answer:
{ $facet: { pipeline1: [ { $match: {} } ], pipeline2: [ { $group: {} } ] } } -> Option AQuick Check:
$facetneeds named pipelines with arrays of stages [OK]
$facet [OK]- Using arrays directly instead of named pipelines
- Putting stages as objects instead of arrays
- Missing pipeline names inside
$facet
sales with documents like { item: 'apple', price: 10, quantity: 2 }, what will be the output of this aggregation?
{ $facet: { totalSales: [ { $group: { _id: null, total: { $sum: { $multiply: ["$price", "$quantity"] } } } } ], items: [ { $group: { _id: "$item", count: { $sum: "$quantity" } } } ] } }Solution
Step 1: Calculate totalSales pipeline
Multiply price (10) by quantity (2) = 20, sum is 20, grouped with _id null.Step 2: Calculate items pipeline
Group by item 'apple', sum quantity 2, so count is 2.Final Answer:
[{ totalSales: [{ _id: null, total: 20 }], items: [{ _id: 'apple', count: 2 }] }] -> Option AQuick Check:
Each pipeline returns array with grouped results [OK]
$facet outputs arrays for each pipeline [OK]- Expecting direct values instead of arrays
- Mixing up _id values in group results
- Forgetting
$multiplyinside$sum
{ $facet: { sales: { $group: { _id: "$item", total: { $sum: "$quantity" } } } } }
What is the mistake?Solution
Step 1: Check
Each pipeline inside$facetsyntax requirements$facetmust be an array of stages, not a single object.Step 2: Identify the error in the given code
The pipeline 'sales' is given as an object with$group, missing array brackets.Final Answer:
Pipeline stages inside$facetmust be arrays, not objects. -> Option CQuick Check:
$facetpipelines = arrays of stages [OK]
$facet [OK]- Using object instead of array for pipeline stages
- Assuming
$groupis disallowed inside$facet - Thinking
$facetmust be last stage
products collection in one query. Which $facet pipeline correctly achieves this?Solution
Step 1: Understand
Each facet must be a named pipeline with an array of stages.$facetstructureStep 2: Check each option
{ $facet: { avgPrice: [ { $group: { _id: null, avg: { $avg: "$price" } } } ], uniqueItems: [ { $group: { _id: "$item" } } ] } } correctly uses two pipelines: one groups to get average price, the other groups by item to get unique items. Options B, C, and D misuse arrays or operators incorrectly.Final Answer:
{ $facet: { avgPrice: [ { $group: { _id: null, avg: { $avg: "$price" } } } ], uniqueItems: [ { $group: { _id: "$item" } } ] } } -> Option BQuick Check:
Named pipelines with arrays of stages = correct$facetusage [OK]
- Using
$facetwith arrays instead of named pipelines - Trying to use aggregation operators directly inside
$facet - Not grouping properly to get unique items
Ready to prove it?
Pass the test and this pattern moves unknown
