Change stream events (insert, update, delete) in MongoDB - Time & Space Complexity
When watching for changes in a MongoDB collection, we want to know how the cost grows as more events happen.
How does the system handle more insert, update, or delete events over time?
Analyze the time complexity of the following code snippet.
const changeStream = collection.watch();
changeStream.on('change', (event) => {
if (event.operationType === 'insert') {
console.log('New document inserted');
} else if (event.operationType === 'update') {
console.log('Document updated');
} else if (event.operationType === 'delete') {
console.log('Document deleted');
}
});
This code listens for insert, update, and delete events on a collection and reacts to each event as it happens.
- Primary operation: Handling each change event as it arrives.
- How many times: Once per event, repeating indefinitely as changes occur.
Each new event triggers one handling operation. More events mean more operations, growing directly with event count.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 event handlers run |
| 100 | 100 event handlers run |
| 1000 | 1000 event handlers run |
Pattern observation: The work grows linearly as the number of events increases.
Time Complexity: O(n)
This means the time to handle events grows in direct proportion to how many events happen.
[X] Wrong: "Handling one event takes constant time no matter how many events happen overall."
[OK] Correct: While one event is handled quickly, the total time grows as more events come in, so overall work depends on event count.
Understanding how event handling scales helps you design systems that stay responsive as data changes grow.
"What if we batch process multiple change events together? How would the time complexity change?"
Practice
Solution
Step 1: Understand the purpose of change streams
Change streams provide a way to watch for changes like inserts, updates, and deletes in real time.Step 2: Compare options with the purpose
Only Listen to real-time insert, update, and delete events on a collection describes listening to these real-time events, while others describe unrelated features.Final Answer:
Listen to real-time insert, update, and delete events on a collection -> Option BQuick Check:
Change streams = real-time event listening [OK]
- Confusing change streams with backups
- Thinking change streams speed up queries
- Mixing change streams with indexing
Solution
Step 1: Recall the MongoDB method for change streams
The official method to watch changes iswatch()on a collection object.Step 2: Verify options
Only db.collection.watch() uses the correct method namewatch(). Others are invalid method names.Final Answer:
db.collection.watch() -> Option CQuick Check:
Correct method = watch() [OK]
- Using listen() or observe() which don't exist
- Confusing with monitor() which is not a method
- Forgetting to call watch() on the collection
const changeStream = db.collection('users').watch();
changeStream.on('change', (change) => {
console.log(change.operationType);
});
// Then a document is deleted from 'users'Solution
Step 1: Understand operationType values in change streams
When a document is deleted, theoperationTypeis "delete".Step 2: Match the event with the logged output
The code logschange.operationType, so deleting a document logs "delete".Final Answer:
"delete" -> Option AQuick Check:
Delete event logs "delete" [OK]
- Confusing delete with update or insert
- Expecting 'remove' instead of 'delete'
- Not knowing operationType values
const changeStream = db.collection('orders').watch;
changeStream.on('change', (change) => {
console.log(change);
});
What is the error?Solution
Step 1: Identify how watch() is called
The code assignsdb.collection('orders').watchwithout parentheses, so it assigns the function itself, not the stream.Step 2: Understand the error cause
Without callingwatch()with parentheses,changeStreamis not a stream and has noonmethod, causing an error.Final Answer:
Missing parentheses after watch() method call -> Option DQuick Check:
Call watch() with () to get stream [OK]
- Forgetting parentheses after watch
- Thinking event name 'change' is wrong
- Confusing const vs let for streams
const changeStream = db.collection('products').watch([
{ $match: { 'operationType': 'insert' } }
]);
changeStream.on('change', (change) => {
console.log(change.fullDocument);
});Solution
Step 1: Understand change stream pipeline filtering
You can pass an aggregation pipeline towatch()to filter events, using $match on 'operationType'.Step 2: Verify the filter syntax
The code uses{ $match: { 'operationType': 'insert' } }, which is the correct way to filter for insert events.Final Answer:
The code correctly filters for insert events only -> Option AQuick Check:
Filter inserts with $match on operationType [OK]
- Using wrong field name like operation_type
- Filtering inside callback instead of pipeline
- Thinking filtering is not supported
Ready to prove it?
Pass the test and this pattern moves unknown
