Bird
Raised Fist0
MongoDBquery~5 mins

$facet for multiple pipelines in MongoDB - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: $facet for multiple pipelines
O(k x n)
Understanding Time Complexity

When using $facet in MongoDB, we run several pipelines at once on the same data. Understanding how this affects time helps us know how the work grows as data grows.

We want to see how the total work changes when we add more data or more pipelines.

Scenario Under Consideration

Analyze the time complexity of the following code snippet.

db.collection.aggregate([
  {
    $facet: {
      pipeline1: [ { $match: { status: "A" } }, { $count: "countA" } ],
      pipeline2: [ { $match: { qty: { $gt: 50 } } }, { $group: { _id: "$item", total: { $sum: "$qty" } } } ]
    }
  }
])

This code runs two pipelines at the same time on the same collection: one counts documents with status "A", the other groups items with quantity over 50.

Identify Repeating Operations

Look for repeated work inside the pipelines.

  • Primary operation: Each pipeline scans the documents to filter and process them.
  • How many times: Each pipeline processes all documents independently, so the scanning repeats for each pipeline.
How Execution Grows With Input

As the number of documents grows, each pipeline must check more documents.

Input Size (n)Approx. Operations
10About 2 x 10 = 20 operations
100About 2 x 100 = 200 operations
1000About 2 x 1000 = 2000 operations

Pattern observation: The total work grows roughly linearly with data size, multiplied by the number of pipelines.

Final Time Complexity

Time Complexity: O(k x n)

This means the work grows linearly with the number of documents n and the number of pipelines k inside $facet.

Common Mistake

[X] Wrong: "Using $facet runs all pipelines in one pass, so it only scans data once no matter how many pipelines there are."

[OK] Correct: Each pipeline inside $facet runs independently, so the data is scanned separately for each pipeline, multiplying the work.

Interview Connect

Knowing how $facet scales helps you explain performance trade-offs clearly. It shows you understand how MongoDB processes multiple tasks at once, a useful skill in real projects.

Self-Check

What if we added more pipelines inside $facet? How would the time complexity change?

Practice

(1/5)
1. What does the $facet stage do in a MongoDB aggregation pipeline?
easy
A. Sorts documents in ascending or descending order.
B. Filters documents based on a condition.
C. Joins two collections together.
D. Runs multiple pipelines on the same input data and returns results in one document.

Solution

  1. Step 1: Understand the purpose of $facet

    $facet allows running multiple aggregation pipelines on the same input data simultaneously.
  2. Step 2: Identify the output structure

    The output is a single document containing separate arrays for each pipeline's results.
  3. Final Answer:

    Runs multiple pipelines on the same input data and returns results in one document. -> Option D
  4. Quick Check:

    $facet = multiple pipelines, one output document [OK]
Hint: Remember: $facet runs many pipelines at once [OK]
Common Mistakes:
  • Thinking $facet filters or sorts data
  • Confusing $facet with $lookup
  • Assuming it returns multiple documents instead of one
2. Which of the following is the correct syntax to use $facet in a MongoDB aggregation pipeline?
easy
A. { $facet: { pipeline1: [ { $match: {} } ], pipeline2: [ { $group: {} } ] } }
B. { $facet: [ { $match: {} }, { $group: {} } ] }
C. { $facet: { $match: {}, $group: {} } }
D. { $facet: { pipeline1: { $match: {} }, pipeline2: { $group: {} } } }

Solution

  1. Step 1: Recall $facet syntax

    $facet expects an object where each key is a pipeline name and the value is an array of pipeline stages.
  2. 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.
  3. Final Answer:

    { $facet: { pipeline1: [ { $match: {} } ], pipeline2: [ { $group: {} } ] } } -> Option A
  4. Quick Check:

    $facet needs named pipelines with arrays of stages [OK]
Hint: Use named keys with arrays of stages inside $facet [OK]
Common Mistakes:
  • Using arrays directly instead of named pipelines
  • Putting stages as objects instead of arrays
  • Missing pipeline names inside $facet
3. Given the collection 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" } } } ] } }
medium
A. [{ totalSales: [{ _id: null, total: 20 }], items: [{ _id: 'apple', count: 2 }] }]
B. [{ totalSales: 20, items: [{ _id: 'apple', count: 2 }] }]
C. [{ totalSales: [{ total: 20 }], items: [{ _id: 'apple', count: 2 }] }]
D. [{ totalSales: [{ _id: null, total: 12 }], items: [{ _id: 'apple', count: 2 }] }]

Solution

  1. Step 1: Calculate totalSales pipeline

    Multiply price (10) by quantity (2) = 20, sum is 20, grouped with _id null.
  2. Step 2: Calculate items pipeline

    Group by item 'apple', sum quantity 2, so count is 2.
  3. Final Answer:

    [{ totalSales: [{ _id: null, total: 20 }], items: [{ _id: 'apple', count: 2 }] }] -> Option A
  4. Quick Check:

    Each pipeline returns array with grouped results [OK]
Hint: Remember $facet outputs arrays for each pipeline [OK]
Common Mistakes:
  • Expecting direct values instead of arrays
  • Mixing up _id values in group results
  • Forgetting $multiply inside $sum
4. You wrote this aggregation but get an error:
{ $facet: { sales: { $group: { _id: "$item", total: { $sum: "$quantity" } } } } }
What is the mistake?
medium
A. The $facet stage must be the last stage in the pipeline.
B. You cannot use $group inside $facet.
C. Pipeline stages inside $facet must be arrays, not objects.
D. The field names inside $group are incorrect.

Solution

  1. Step 1: Check $facet syntax requirements

    Each pipeline inside $facet must be an array of stages, not a single object.
  2. Step 2: Identify the error in the given code

    The pipeline 'sales' is given as an object with $group, missing array brackets.
  3. Final Answer:

    Pipeline stages inside $facet must be arrays, not objects. -> Option C
  4. Quick Check:

    $facet pipelines = arrays of stages [OK]
Hint: Always wrap pipeline stages in arrays inside $facet [OK]
Common Mistakes:
  • Using object instead of array for pipeline stages
  • Assuming $group is disallowed inside $facet
  • Thinking $facet must be last stage
5. You want to get both the average price and a list of unique items from a products collection in one query. Which $facet pipeline correctly achieves this?
hard
A. { $facet: [ { $group: { _id: null, avg: { $avg: "$price" } } }, { $group: { _id: "$item" } } ] }
B. { $facet: { avgPrice: [ { $group: { _id: null, avg: { $avg: "$price" } } } ], uniqueItems: [ { $group: { _id: "$item" } } ] } }
C. { $facet: { avgPrice: { $avg: "$price" }, uniqueItems: { $addToSet: "$item" } } }
D. { $facet: { avgPrice: [ { $avg: "$price" } ], uniqueItems: [ { $addToSet: "$item" } ] } }

Solution

  1. Step 1: Understand $facet structure

    Each facet must be a named pipeline with an array of stages.
  2. Step 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.
  3. Final Answer:

    { $facet: { avgPrice: [ { $group: { _id: null, avg: { $avg: "$price" } } } ], uniqueItems: [ { $group: { _id: "$item" } } ] } } -> Option B
  4. Quick Check:

    Named pipelines with arrays of stages = correct $facet usage [OK]
Hint: Use separate pipelines with arrays for each facet [OK]
Common Mistakes:
  • Using $facet with arrays instead of named pipelines
  • Trying to use aggregation operators directly inside $facet
  • Not grouping properly to get unique items
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