The $facet stage lets you run many different queries on the same data at once. It helps you get multiple results in one go.
$facet for multiple pipelines in MongoDB
db.collection.aggregate([
{
$facet: {
pipeline1Name: [ /* stages for first pipeline */ ],
pipeline2Name: [ /* stages for second pipeline */ ]
}
}
])Each pipeline inside $facet runs independently on the same input data.
The output is one document with fields named after each pipeline, each holding an array of results.
db.sales.aggregate([
{
$facet: {
totalSales: [ { $group: { _id: null, total: { $sum: "$amount" } } } ],
averageSales: [ { $group: { _id: null, avg: { $avg: "$amount" } } } ]
}
}
])db.products.aggregate([
{
$facet: {
cheapProducts: [ { $match: { price: { $lt: 20 } } } ],
expensiveProducts: [ { $match: { price: { $gte: 20 } } } ]
}
}
])This query gets three results at once: total number of orders, count of orders by status, and the 3 most recent orders.
db.orders.aggregate([
{
$facet: {
totalOrders: [ { $count: "count" } ],
ordersByStatus: [ { $group: { _id: "$status", count: { $sum: 1 } } } ],
recentOrders: [ { $sort: { orderDate: -1 } }, { $limit: 3 } ]
}
}
])Each pipeline inside $facet can have multiple stages like $match, $group, $sort, etc.
The output document always has one field per pipeline, each containing an array of results.
Use $facet to avoid running multiple separate queries when you want different views of the same data.
$facet runs many pipelines on the same data at once.
It returns one document with results from each pipeline as separate arrays.
Great for getting multiple summaries or lists in a single 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
