Time-series collections in MongoDB - Time & Space Complexity
When working with time-series collections in MongoDB, it is important to understand how the time to run queries grows as the amount of data increases.
We want to know how the database handles many time-stamped records efficiently.
Analyze the time complexity of the following MongoDB query on a time-series collection.
db.sensorData.find({
timestamp: { $gte: ISODate("2024-01-01T00:00:00Z"), $lt: ISODate("2024-01-02T00:00:00Z") }
})
.sort({ timestamp: 1 })
.limit(100)
This query fetches up to 100 records from a time-series collection for one day, sorted by time.
Look at what repeats as the data grows:
- Primary operation: Scanning the time index to find matching records.
- How many times: The database scans only the relevant time range, not the whole collection.
As the total data grows, the query only looks at the time range requested.
| Input Size (n) | Approx. Operations |
|---|---|
| 10,000 records total | Operations proportional to records in one day |
| 100,000 records total | Still proportional to one day's records, not total |
| 1,000,000 records total | Same as above, depends on day's data size |
Pattern observation: The query cost grows with the size of the time range, not the total data size.
Time Complexity: O(k)
This means the query time grows linearly with the number of records in the requested time range, not the whole collection.
[X] Wrong: "Query time grows with total data size in the collection."
[OK] Correct: Time-series collections use indexes on time, so queries only scan relevant time slices, not all data.
Understanding how time-series collections handle queries helps you explain efficient data retrieval in real-world apps that track events over time.
What if we removed the time range filter and queried without it? How would the time complexity change?
Practice
Solution
Step 1: Understand time-series data
Time-series data is data recorded over time, like temperature or stock prices.Step 2: Identify MongoDB time-series collection use
MongoDB time-series collections optimize storage and queries for such time-based data.Final Answer:
To efficiently store and query data that changes over time -> Option CQuick Check:
Time-series collections = efficient time-based data storage [OK]
- Confusing time-series collections with file storage
- Thinking time-series collections manage users
- Assuming they handle backups automatically
Solution
Step 1: Recall time-series collection requirements
MongoDB requires a time field to track when each data point was recorded.Step 2: Check other options
Unique _id index exists by default but is not specific to time-series; user roles and binary data fields are unrelated.Final Answer:
A field that stores the timestamp of each record -> Option DQuick Check:
Time field required = A field that stores the timestamp of each record [OK]
- Choosing unrelated fields like user roles
- Confusing default indexes with required time field
- Thinking binary data field is required
db.createCollection("sensorData", {
timeseries: {
timeField: "timestamp",
metaField: "deviceId"
}
})Solution
Step 1: Analyze the createCollection command
The command uses the timeseries option with timeField and metaField specified.Step 2: Understand MongoDB behavior
This creates a time-series collection named sensorData with timestamp as time and deviceId as metadata.Final Answer:
Creates a time-series collection with timestamp and deviceId fields -> Option AQuick Check:
timeseries option creates time-series collection [OK]
- Thinking it creates a regular or capped collection
- Assuming syntax error due to missing options
- Confusing metaField with required timeField
db.createCollection("temps", {
timeseries: {
metaField: "location"
}
})Solution
Step 1: Check timeseries options in the command
The command specifies metaField but omits the required timeField.Step 2: Recall MongoDB requirements
timeField is mandatory for time-series collections; missing it causes an error.Final Answer:
Missing required timeField in timeseries options -> Option AQuick Check:
timeField missing = error [OK]
- Thinking metaField is not allowed
- Assuming collection name is invalid
- Believing timeseries option is misspelled
timestamp (timeField) and sensorId (metaField). You want to query the average temperature for sensorId 'S1' over the last 24 hours. Which aggregation pipeline is correct?
db.sensorData.aggregate([
{ $match: { sensorId: 'S1', timestamp: { $gte: new Date(Date.now() - 86400000) } } },
{ $group: { _id: null, avgTemp: { $avg: "$temperature" } } }
])Solution
Step 1: Analyze the $match stage
The pipeline filters documents where sensorId is 'S1' and timestamp is within last 24 hours.Step 2: Analyze the $group stage
It groups all matched documents (_id: null) and calculates average temperature.Final Answer:
Correctly filters by sensorId and timestamp, then averages temperature -> Option BQuick Check:
Filter by sensorId and time, then average = Correctly filters by sensorId and timestamp, then averages temperature [OK]
- Forgetting to filter by sensorId
- Using $sort instead of $match for filtering
- Grouping by sensorId when only one sensor is queried
Ready to prove it?
Pass the test and this pattern moves unknown
