$size operator for array length in MongoDB - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
We want to understand how the time it takes to find the length of an array grows as the array gets bigger.
Specifically, how does MongoDB's $size operator behave when counting elements in an array?
Analyze the time complexity of the following code snippet.
db.collection.aggregate([
{
$project: {
arrayLength: { $size: "$items" }
}
}
])
This code calculates the length of the items array for each document in the collection.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Counting each element in the
itemsarray to find its length. - How many times: Once per document, and internally once per element in the array.
As the array size grows, the time to count its elements grows roughly in direct proportion.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps to count |
| 100 | About 100 steps to count |
| 1000 | About 1000 steps to count |
Pattern observation: The counting work grows linearly as the array gets bigger.
Time Complexity: O(n)
This means the time to get the array length grows directly with the number of elements in the array.
[X] Wrong: "Using $size is instant no matter how big the array is."
[OK] Correct: MongoDB must look at each element to count them, so bigger arrays take more time.
Knowing how array operations scale helps you write efficient queries and explain your choices clearly in interviews.
"What if the array was stored as a separate collection and you counted documents instead? How would the time complexity change?"
Practice
$size operator do in MongoDB?Solution
Step 1: Understand the purpose of
The$size$sizeoperator is used to count how many elements are inside an array field in a MongoDB document.Step 2: Compare with other options
Other options describe different operations like sum, max, or sort, which are not what$sizedoes.Final Answer:
Counts the number of elements in an array -> Option AQuick Check:
$size= count array elements [OK]
- Confusing $size with sum or max functions
- Thinking $size sorts arrays
- Using $size on non-array fields
$size in a MongoDB aggregation pipeline to add a field itemCount that counts elements in the items array?Solution
Step 1: Identify correct operator usage in aggregation
The$sizeoperator is used inside an expression to count array elements. It must be inside a stage like$addFieldsor$projectwith the array field referenced as"$items".Step 2: Check syntax correctness
{ $addFields: { itemCount: { $length: "$items" } } } uses a non-existent$length. { $project: { itemCount: { $size: "items" } } } misses the $ before items. { $match: { itemCount: { $size: "$items" } } } misuses$matchwith$size.Final Answer:
{ $addFields: { itemCount: { $size: "$items" } } } -> Option DQuick Check:
Use $size inside $addFields with "$arrayField" [OK]
- Using $length instead of $size
- Forgetting the $ before array field name
- Using $size inside $match incorrectly
{ "name": "Alice", "tags": ["red", "blue"] }{ "name": "Bob", "tags": ["green"] }{ "name": "Carol", "tags": [] }What will be the result of this aggregation pipeline?
[{ $project: { name: 1, tagCount: { $size: "$tags" } } }]Solution
Step 1: Understand $size counts array elements
For each document,$sizecounts how many items are in thetagsarray: Alice has 2, Bob has 1, Carol has 0.Step 2: Apply $project to include name and tagCount
The pipeline projects thenameand addstagCountwith the counted size.Final Answer:
[{ "name": "Alice", "tagCount": 2 }, { "name": "Bob", "tagCount": 1 }, { "name": "Carol", "tagCount": 0 }] -> Option AQuick Check:
Count array lengths with $size = correct counts [OK]
- Assuming empty arrays count as 1
- Mixing up counts for different documents
- Expecting syntax error for correct query
{ $match: { tags: { $size: 3 } } }But it returns an error. What is the problem?
Solution
Step 1: Understand $size usage in $match
Directly using$sizeinside$matchlike this is invalid because$sizeis an aggregation expression, not a query operator.Step 2: Use $expr to evaluate aggregation expressions in $match
To filter by array length, you must use$exprwith$size, like:{ $match: { $expr: { $eq: [ { $size: "$tags" }, 3 ] } } }.Final Answer:
The $match stage requires $expr to use $size -> Option BQuick Check:
Use $expr for aggregation expressions in $match [OK]
- Trying to use $size directly in $match
- Forgetting $expr wrapper
- Using quotes around numbers incorrectly
comments array has more than 2 elements. Which aggregation pipeline stage correctly filters these documents?Solution
Step 1: Use $expr to evaluate expressions in $match
To compare array length, use$exprto allow aggregation expressions inside$match.Step 2: Use $gt with $size to check array length greater than 2
The correct syntax is{ $gt: [ { $size: "$comments" }, 2 ] }inside$expr.Step 3: Eliminate incorrect options
The incorrect options either lack$expr, misuse$sizeplacement, or have wrong syntax for$gt.Final Answer:
{ $match: { $expr: { $gt: [ { $size: "$comments" }, 2 ] } } } -> Option CQuick Check:
Filter by array length with $expr and $gt [OK]
- Using $size as a query operator inside $match
- Wrong order or structure of $gt and $size
- Missing $expr wrapper
