Soft delete pattern 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 to find active records changes as the database grows when using the soft delete pattern.
Specifically, how does filtering out deleted items affect query speed?
Analyze the time complexity of the following MongoDB query using soft delete.
// Find all active users (not deleted)
db.users.find({ deleted: { $ne: true } })
This query fetches all users who are not marked as deleted by checking the 'deleted' field.
Look for repeated work done by the database to answer the query.
- Primary operation: Scanning user records to check the 'deleted' field.
- How many times: Once for each user document in the collection.
As the number of users grows, the database must check more documents to find active ones.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 checks |
| 100 | 100 checks |
| 1000 | 1000 checks |
Pattern observation: The number of checks grows directly with the number of users.
Time Complexity: O(n)
This means the time to find active users grows linearly with the total number of users.
[X] Wrong: "Adding a 'deleted' flag means queries will always be fast regardless of data size."
[OK] Correct: Without an index on the 'deleted' field, MongoDB must check every document, so query time grows with data size.
Understanding how soft delete affects query time shows you grasp practical database design and performance trade-offs.
"What if we add an index on the 'deleted' field? How would the time complexity change?"
Practice
Solution
Step 1: Understand soft delete concept
Soft delete means marking data as deleted but keeping it in the database.Step 2: Compare options
Only To mark data as deleted without actually removing it from the database describes marking data as deleted without removal.Final Answer:
To mark data as deleted without actually removing it from the database -> Option DQuick Check:
Soft delete = mark, not remove [OK]
- Confusing soft delete with hard delete
- Thinking soft delete removes data
- Assuming soft delete encrypts data
Solution
Step 1: Identify common soft delete fields
Soft delete usually uses a boolean field like 'deleted' set to true or false.Step 2: Check options for correct boolean usage
{ deleted: true } uses { deleted: true } which is standard and correct.Final Answer:
{ deleted: true } -> Option AQuick Check:
Soft delete flag = boolean true [OK]
- Using string values instead of boolean
- Using unrelated field names
- Confusing deletedAt with boolean flag
{ _id: 1, name: 'Alice', deleted: false }{ _id: 2, name: 'Bob', deleted: true }What will this query return?
db.users.find({ deleted: false })Solution
Step 1: Understand the query filter
The query filters documents where deleted is false.Step 2: Check documents matching filter
Only the document with _id 1 has deleted: false, so it is returned.Final Answer:
[{ _id: 1, name: 'Alice', deleted: false }] -> Option AQuick Check:
Filter deleted: false returns Alice [OK]
- Returning documents with deleted: true
- Returning empty result incorrectly
- Assuming query returns all documents
deleted: true. Which of these update commands is correct?Solution
Step 1: Recall MongoDB update syntax
To update a field, use $set operator with the new value.Step 2: Analyze options
db.collection.updateOne({ _id: 1 }, { $set: { deleted: true } }) correctly uses $set to set deleted: true. db.collection.updateOne({ _id: 1 }, { deleted: true }) misses $set, causing replacement. Options C and D use wrong operators.Final Answer:
db.collection.updateOne({ _id: 1 }, { $set: { deleted: true } }) -> Option BQuick Check:
Use $set to update fields [OK]
- Omitting $set causing document replacement
- Using $unset instead of $set
- Using $push on non-array field
Solution
Step 1: Understand requirement
We want all documents, including deleted, but sorted so deleted: false first.Step 2: Analyze sorting by deleted field
Sorting by deleted: 1 sorts false (0) before true (1), so non-deleted come first.Step 3: Check options
db.collection.find().sort({ deleted: 1 }) finds all and sorts by deleted ascending, matching requirement. db.collection.find({ deleted: false }).sort({ name: 1 }) filters out deleted documents. db.collection.find().sort({ deleted: -1 }) sorts deleted descending (deleted first). db.collection.find({ deleted: { $exists: false } }) filters documents missing deleted field.Final Answer:
db.collection.find().sort({ deleted: 1 }) -> Option CQuick Check:
Sort by deleted ascending puts non-deleted first [OK]
- Filtering out deleted documents instead of including all
- Sorting deleted descending to put deleted first
- Filtering by missing deleted field
