Comparison expressions ($eq, $gt in aggregation) in MongoDB - Time & Space Complexity
When using comparison expressions like $eq and $gt in MongoDB aggregation, it's important to understand how the time to run these checks grows as the data grows.
We want to know how the number of comparisons affects the total work done.
Analyze the time complexity of the following aggregation pipeline snippet.
db.collection.aggregate([
{ $match: { $expr: { $gt: ["$score", 50] } } },
{ $project: { name: 1, passed: { $eq: ["$status", "passed"] } } }
])
This pipeline filters documents where the score is greater than 50, then adds a field passed that is true if status equals "passed".
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The aggregation processes each document once, applying
$gtand$eqcomparisons. - How many times: Each comparison runs once per document in the input collection.
As the number of documents grows, the number of comparisons grows at the same rate.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 comparisons |
| 100 | About 100 comparisons |
| 1000 | About 1000 comparisons |
Pattern observation: The work grows directly with the number of documents, doubling the documents doubles the comparisons.
Time Complexity: O(n)
This means the time to run these comparisons grows in a straight line with the number of documents.
[X] Wrong: "Comparison expressions like $eq and $gt run once and don't depend on data size."
[OK] Correct: Each document must be checked, so the number of comparisons grows with the number of documents.
Understanding how comparison operations scale helps you explain query performance clearly and shows you know how MongoDB processes data step-by-step.
"What if we added a $lookup stage before the $match? How would that affect the time complexity of the comparison expressions?"
Practice
$eq operator do in a MongoDB aggregation pipeline?Solution
Step 1: Understand the purpose of
The$eq$eqoperator compares two values to see if they are exactly the same.Step 2: Compare with other operators
Unlike$gtwhich checks if one value is greater,$eqchecks equality.Final Answer:
Checks if two values are equal -> Option CQuick Check:
$eqmeans equal [OK]
- Confusing $eq with $gt
- Thinking $eq sorts data
- Using $eq to check field existence
$gt in a MongoDB aggregation $match stage to find documents where age is greater than 30?Solution
Step 1: Recall correct operator syntax
MongoDB operators like$gtare used as keys inside an object with the field name as the key.Step 2: Match correct structure
The correct syntax is{ field: { $gt: value } }, so{ age: { $gt: 30 } }is correct.Final Answer:
{ $match: { age: { $gt: 30 } } } -> Option BQuick Check:
Correct operator syntax = { $match: { age: { $gt: 30 } } } [OK]
- Placing $gt outside the field object
- Using parentheses like a function
- Missing $ before gt
{ $match: { score: { $gt: 80 } } }Which documents will be matched if the collection has documents with scores: 75, 80, 85, 90?
Solution
Step 1: Understand $gt meaning
The$gtoperator matches values strictly greater than the given number, here 80.Step 2: Check which scores are greater than 80
Scores 85 and 90 are greater than 80; 75 and 80 are not.Final Answer:
Documents with scores 85 and 90 -> Option DQuick Check:
Only scores > 80 match = Documents with scores 85 and 90 [OK]
- Including values equal to 80
- Confusing $gt with $gte
- Selecting lower values by mistake
$match stage:{ $match: { $eq: ["$status", "active"] } }Solution
Step 1: Check $eq usage in $match
The$eqoperator is usually used inside$expror aggregation expressions, not directly as a key in$match.Step 2: Understand correct placement
To compare fields with$eq, it must be inside$expr, like{ $match: { $expr: { $eq: ["$status", "active"] } } }.Final Answer:
Incorrect use of $eq outside a field key -> Option AQuick Check:
$eq needs $expr for expressions [OK]
- Using $eq directly in $match without $expr
- Confusing $eq array syntax
- Assuming $eq works like a filter key
price is greater than 100 and category equals "electronics" using aggregation. Which $match stage correctly uses $gt and $eq together?Solution
Step 1: Understand simple field comparisons
For simple equality, you can directly writecategory: "electronics"without using$eq.Step 2: Combine conditions in $match
MongoDB$matchsupports multiple field conditions combined with AND by default, so{ price: { $gt: 100 }, category: "electronics" }works.Step 3: Check other options
{ $match: { price: { $gt: 100 }, category: { $eq: "electronics" } } } misuses$eqinside$match(not needed). { $match: { $and: [ { price: { $gt: 100 } }, { category: { $eq: "electronics" } } ] } } uses$andunnecessarily. { $match: { $expr: { $and: [ { $gt: ["$price", 100] }, { $eq: ["$category", "electronics"] } ] } } } uses$exprwhich is more complex than needed.Final Answer:
{ $match: { price: { $gt: 100 }, category: "electronics" } } -> Option AQuick Check:
Simple conditions combine directly in $match [OK]
- Overusing $eq inside $match
- Using $and unnecessarily
- Using $expr when not needed
Ready to prove it?
Pass the test and this pattern moves unknown
