Soft delete lets you mark data as deleted without removing it. This helps keep data safe and recoverable.
Soft delete pattern in MongoDB
Start learning this pattern below
Jump into concepts and practice - no test required
db.collection.updateOne(
{ _id: ObjectId("id_here") },
{ $set: { deleted: true, deletedAt: new Date() } }
)Use a boolean field like deleted to mark if an item is deleted.
Optionally add a deletedAt timestamp to know when it was deleted.
deleted to true and recording the time.db.users.updateOne(
{ _id: ObjectId("507f1f77bcf86cd799439011") },
{ $set: { deleted: true, deletedAt: new Date() } }
)db.products.updateMany(
{ category: "old" },
{ $set: { deleted: true, deletedAt: new Date() } }
)db.orders.find({ deleted: { $ne: true } })This example soft deletes one product by setting deleted to true and adds a timestamp. Then it finds all products that are still active (not deleted).
use shopDB // Soft delete a product by id const productId = ObjectId("642f1f77bcf86cd799439012") db.products.updateOne( { _id: productId }, { $set: { deleted: true, deletedAt: new Date() } } ) // Query products that are not deleted db.products.find({ deleted: { $ne: true } })
Remember to always filter out documents where deleted is true when querying active data.
Soft delete keeps data safe but can increase database size over time.
You can add a background job to permanently delete old soft deleted data if needed.
Soft delete marks data as deleted without removing it.
Use a deleted boolean and optional deletedAt timestamp.
Always filter queries to exclude soft deleted data unless you want to see it.
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
