Bird
Raised Fist0
Expressframework~10 mins

Deleting documents in Express - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Deleting documents
Receive DELETE request
Extract document ID
Call database delete method
Check if document exists
Delete doc
Send success response
End request
This flow shows how an Express app handles a DELETE request to remove a document by ID, checks if it exists, deletes it if found, and sends the right response.
Execution Sample
Express
app.delete('/items/:id', async (req, res) => {
  const id = req.params.id;
  const result = await db.collection('items').deleteOne({ _id: new ObjectId(id) });
  if (result.deletedCount === 0) {
    return res.status(404).send('Not found');
  }
  res.send('Deleted');
});
This code deletes an item by ID from the database and sends a success or 404 response.
Execution Table
StepActionInput/ConditionResultResponse Sent
1Receive DELETE requestURL: /items/123Extract id = '123'No
2Call deleteOne{ _id: new ObjectId('123') }deletedCount = 1No
3Check deletedCountdeletedCount === 0?FalseNo
4Send success responseDeleted documentResponse: 200 OK, 'Deleted'Yes
5Request ends---
6Receive DELETE requestURL: /items/999Extract id = '999'No
7Call deleteOne{ _id: new ObjectId('999') }deletedCount = 0No
8Check deletedCountdeletedCount === 0?TrueNo
9Send 404 responseDocument not foundResponse: 404 Not Found, 'Not found'Yes
10Request ends---
💡 Execution stops after sending response to client (either success or 404).
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4Final
idundefined'123''123''123''123''123'
result.deletedCountundefinedundefined1111
response statusundefinedundefinedundefined200 OK200 OK200 OK
Key Moments - 2 Insights
Why do we check if deletedCount is 0?
Because if deletedCount is 0, it means no document matched the ID, so we send a 404 Not Found response (see execution_table row 8).
What happens if the document exists and is deleted?
The server sends a 200 OK response with message 'Deleted' (see execution_table row 4).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of 'id' after Step 1 when deleting '/items/123'?
A'123'
B'999'
Cundefined
Dnull
💡 Hint
Check the 'id' variable in variable_tracker after Step 1.
At which step does the server send a 404 Not Found response for a missing document?
AStep 8
BStep 9
CStep 4
DStep 10
💡 Hint
Look at the 'Response Sent' column in execution_table rows for missing document.
If the document is found and deleted, what is the deletedCount value returned by deleteOne?
A0
Bundefined
C1
D-1
💡 Hint
See 'result.deletedCount' in variable_tracker after Step 2.
Concept Snapshot
Express DELETE route:
app.delete('/items/:id', async (req, res) => {
  const id = req.params.id;
  const result = await db.collection('items').deleteOne({ _id: new ObjectId(id) });
  if (result.deletedCount === 0) return res.status(404).send('Not found');
  res.send('Deleted');
});
Checks if document exists, deletes it, sends 404 if missing.
Full Transcript
This visual execution shows how an Express app deletes documents. When a DELETE request arrives, it extracts the document ID from the URL. Then it calls the database's deleteOne method with that ID. If no document matches (deletedCount is 0), it sends a 404 Not Found response. Otherwise, it sends a success message. The execution table traces two cases: deleting an existing document and trying to delete a missing one. Variables like 'id' and 'deletedCount' update step-by-step. Key moments clarify why we check deletedCount and what responses are sent. The quiz tests understanding of variable values and response steps.

Practice

(1/5)
1. What does the deleteOne() method do in Express when working with a database?
easy
A. Deletes a single document that matches the filter criteria.
B. Deletes all documents in the collection.
C. Updates a document instead of deleting it.
D. Finds a document but does not delete it.

Solution

  1. Step 1: Understand deleteOne() purpose

    The deleteOne() method removes only one document that matches the given filter.
  2. Step 2: Compare with other methods

    deleteMany() deletes multiple documents, and find() only retrieves data without deleting.
  3. Final Answer:

    Deletes a single document that matches the filter criteria. -> Option A
  4. Quick Check:

    deleteOne() = deletes one document [OK]
Hint: Remember: deleteOne removes just one matching document [OK]
Common Mistakes:
  • Confusing deleteOne with deleteMany
  • Thinking deleteOne updates documents
  • Assuming deleteOne finds but does not delete
2. Which of the following is the correct syntax to delete a document by its ID using Mongoose in Express?
easy
A. Model.findByIdAndDelete(id, callback);
B. Model.deleteById(id);
C. Model.removeById(id);
D. Model.deleteOneById(id);

Solution

  1. Step 1: Recall Mongoose method for deleting by ID

    The correct method is findByIdAndDelete() which deletes a document by its ID.
  2. Step 2: Check syntax correctness

    Only Model.findByIdAndDelete(id, callback); matches the official Mongoose syntax.
  3. Final Answer:

    Model.findByIdAndDelete(id, callback); -> Option A
  4. Quick Check:

    Use findByIdAndDelete to delete by ID [OK]
Hint: Use findByIdAndDelete to remove by ID [OK]
Common Mistakes:
  • Using non-existent methods like deleteById
  • Confusing deleteOne with findByIdAndDelete
  • Missing callback or async handling
3. What will be the output of this code snippet in Express using Mongoose?
Model.deleteMany({ status: 'inactive' })
  .then(result => console.log(result.deletedCount))
  .catch(err => console.error(err));
medium
A. An error because deleteMany does not return deletedCount.
B. The entire deleted documents array.
C. Number of documents deleted with status 'inactive'.
D. Undefined because deleteMany returns nothing.

Solution

  1. Step 1: Understand deleteMany return value

    deleteMany() returns an object with deletedCount indicating how many documents were deleted.
  2. Step 2: Analyze the console.log statement

    The code logs result.deletedCount, so it outputs the number of deleted documents matching the filter.
  3. Final Answer:

    Number of documents deleted with status 'inactive'. -> Option C
  4. Quick Check:

    deleteMany() returns deletedCount [OK]
Hint: deleteMany returns deletedCount in result object [OK]
Common Mistakes:
  • Expecting deleted documents array
  • Assuming deleteMany returns nothing
  • Confusing deletedCount with total documents
4. Identify the error in this Express Mongoose code snippet for deleting a document:
Model.deleteOne({ _id: id }, (err, doc) => {
  if (err) console.log(err);
  else console.log(doc);
});
medium
A. The filter object is missing required fields.
B. The deleteOne method does not accept a callback.
C. The method should be deleteMany to delete one document.
D. The callback parameter doc should be result to access deletion info.

Solution

  1. Step 1: Check callback parameters for deleteOne

    The second callback parameter is a result object, not the deleted document itself.
  2. Step 2: Understand what doc represents

    It should be named result or similar to reflect it contains deletion info like deletedCount, not the document.
  3. Final Answer:

    The callback parameter doc should be result to access deletion info. -> Option D
  4. Quick Check:

    Callback gets result info, not deleted doc [OK]
Hint: Callback second param is result info, not deleted doc [OK]
Common Mistakes:
  • Expecting deleted document in callback
  • Using deleteMany when only one document needed
  • Assuming deleteOne does not accept callbacks
5. You want to delete all documents where the field active is false, but only if the user confirms. Which Express code snippet correctly handles this with error checking?
hard
A. Model.deleteMany({ active: false }, (err, res) => { if (err) throw err; console.log(res); });
B. if(confirm) { Model.deleteMany({ active: false }) .then(res => console.log(`${res.deletedCount} deleted`)) .catch(err => console.error(err)); }
C. if(confirm) { Model.deleteOne({ active: false }) .then(res => console.log(res)) .catch(err => console.error(err)); }
D. Model.deleteMany({ active: false }) .then(res => console.log(res.deletedCount)) .catch(err => console.error(err));

Solution

  1. Step 1: Check user confirmation before deleting

    if(confirm) { Model.deleteMany({ active: false }) .then(res => console.log(`${res.deletedCount} deleted`)) .catch(err => console.error(err)); } uses an if(confirm) check to ensure deletion only happens after user confirmation.
  2. Step 2: Verify deletion and error handling

    It uses deleteMany to delete all matching documents, logs the count, and catches errors properly.
  3. Final Answer:

    if(confirm) { Model.deleteMany({ active: false }) .then(res => console.log(`${res.deletedCount} deleted`)) .catch(err => console.error(err)); } -> Option B
  4. Quick Check:

    Confirm before delete, handle errors [OK]
Hint: Check confirm before deleteMany, handle errors in promise [OK]
Common Mistakes:
  • Using deleteOne instead of deleteMany for multiple docs
  • Not checking user confirmation before deleting
  • Throwing errors instead of catching them