Bird
Raised Fist0
MongoDBquery~5 mins

$pull operator for removing from arrays in MongoDB

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
Introduction

The $pull operator helps you remove specific items from a list inside your data. It makes cleaning up or updating lists easy without changing the whole list.

You want to remove a specific friend from your list of friends in a user profile.
You need to delete a certain tag from a blog post's tags array.
You want to remove a product from a shopping cart stored as an array.
You want to clear out all completed tasks from a to-do list stored in an array.
Syntax
MongoDB
db.collection.updateOne(
  { <filter> },
  { $pull: { <arrayField>: <condition> } }
)

$pull removes all array elements that match the <condition>.

The <condition> can be a value or a query expression.

Examples
Removes the string "reading" from Alice's hobbies array.
MongoDB
db.users.updateOne(
  { name: "Alice" },
  { $pull: { hobbies: "reading" } }
)
Removes all scores less than 50 from Bob's scores array.
MongoDB
db.users.updateOne(
  { name: "Bob" },
  { $pull: { scores: { $lt: 50 } } }
)
Removes all tags that are either "old" or "expired" from Carol's tags array.
MongoDB
db.users.updateOne(
  { name: "Carol" },
  { $pull: { tags: { $in: ["old", "expired"] } } }
)
Sample Program

This example creates a product with a list of features. Then it removes the feature "bluetooth" from the features array using $pull. It prints the product before and after the update to show the change.

MongoDB
use testdb;

// Insert a sample document
db.products.insertOne({
  name: "Smartphone",
  features: ["touchscreen", "camera", "bluetooth", "gps"]
});

print("Before $pull operation:");
printjson(db.products.findOne({ name: "Smartphone" }));

// Remove "bluetooth" feature from the features array
const updateResult = db.products.updateOne(
  { name: "Smartphone" },
  { $pull: { features: "bluetooth" } }
);

print("Update result:", tojson(updateResult));

print("After $pull operation:");
printjson(db.products.findOne({ name: "Smartphone" }));
OutputSuccess
Important Notes

Time complexity: Depends on the size of the array; MongoDB scans the array to find matching elements.

Space complexity: Minimal extra space; modifies the document in place.

Common mistake: Using $pull with a condition that matches no elements will not change the array.

Use $pull when you want to remove specific elements from an array without replacing the whole array. Use $set if you want to replace the entire array.

Summary

$pull removes matching elements from arrays inside documents.

It works with simple values or query conditions.

It updates only the matching elements, keeping the rest of the array intact.

Practice

(1/5)
1. What does the $pull operator do in MongoDB?
easy
A. Removes all array elements that match a specified condition.
B. Adds new elements to an array.
C. Replaces the entire array with a new one.
D. Sorts the elements inside an array.

Solution

  1. Step 1: Understand the purpose of $pull

    The $pull operator is used to remove elements from an array that match a given condition.
  2. Step 2: Compare with other array operators

    Unlike $push which adds elements, $pull removes matching elements without affecting others.
  3. Final Answer:

    Removes all array elements that match a specified condition. -> Option A
  4. Quick Check:

    $pull = Remove matching elements [OK]
Hint: Remember: $pull always removes matching array items [OK]
Common Mistakes:
  • Confusing $pull with $push (which adds elements)
  • Thinking $pull replaces the whole array
  • Assuming $pull sorts or modifies elements
2. Which of the following is the correct syntax to remove the value 5 from the array field numbers in MongoDB?
easy
A. db.collection.updateOne({}, {$pull: {numbers: 5}})
B. db.collection.updateOne({}, {$pull: {numbers: {$ne: 5}}})
C. db.collection.updateOne({}, {$remove: {numbers: 5}})
D. db.collection.updateOne({}, {$pop: {numbers: 5}})

Solution

  1. Step 1: Identify the correct operator and syntax

    The $pull operator removes elements matching the value directly, so {$pull: {numbers: 5}} is correct.
  2. Step 2: Check other options for errors

    db.collection.updateOne({}, {$pop: {numbers: 5}}) uses $pop which only removes first/last elements. db.collection.updateOne({}, {$pull: {numbers: {$ne: 5}}}) uses {$ne: 5} inside $pull which removes non-matching elements. db.collection.updateOne({}, {$remove: {numbers: 5}}) uses invalid $remove operator.
  3. Final Answer:

    db.collection.updateOne({}, {$pull: {numbers: 5}}) -> Option A
  4. Quick Check:

    Simple value removal uses $pull: {field: value} [OK]
Hint: Use $pull: {field: value} to remove simple values [OK]
Common Mistakes:
  • Using $remove instead of $pull
  • Using $pop which removes first or last element only
  • Adding unnecessary query operators for simple values
3. Given the document { _id: 1, tags: ["red", "blue", "green", "blue"] }, what will be the tags array after running db.collection.updateOne({_id: 1}, {$pull: {tags: "blue"}})?
medium
A. ["blue", "blue"]
B. ["red", "blue", "green"]
C. ["red", "green", "blue"]
D. ["red", "green"]

Solution

  1. Step 1: Understand $pull removes all matching elements

    The $pull operator removes every element equal to "blue" from the array.
  2. Step 2: Remove all "blue" elements from the array

    Original array: ["red", "blue", "green", "blue"]. After removal: ["red", "green"] because both "blue" elements are removed.
  3. Final Answer:

    ["red", "green"] -> Option D
  4. Quick Check:

    All "blue" removed = ["red", "green"] [OK]
Hint: Remember $pull removes all matching elements, not just one [OK]
Common Mistakes:
  • Removing only the first matching element
  • Leaving one "blue" element by mistake
  • Confusing $pull with $pop or $pullAll
4. You want to remove all numbers less than 10 from the array field scores. Which of the following update commands will NOT work correctly?
medium
A. db.collection.updateOne({}, {$pull: {scores: { $lt: 10 }}})
B. db.collection.updateOne({}, {$pull: {scores: {$lt: 10}}})
C. db.collection.updateOne({}, {$pull: {scores: { $gte: 10 }}})
D. db.collection.updateOne({}, {$pull: {scores: {$lt:10}}})

Solution

  1. Step 1: Understand the condition to remove numbers less than 10

    The correct condition is {$lt: 10} to remove numbers less than 10.
  2. Step 2: Analyze each option

    Options B, C, and D use {$lt: 10} correctly. db.collection.updateOne({}, {$pull: {scores: { $gte: 10 }}}) uses {$gte: 10}, which removes numbers greater than or equal to 10, the opposite of the goal.
  3. Final Answer:

    db.collection.updateOne({}, {$pull: {scores: { $gte: 10 }}}) -> Option C
  4. Quick Check:

    Use $lt to remove less than 10, not $gte [OK]
Hint: Use correct comparison operator inside $pull condition [OK]
Common Mistakes:
  • Using wrong comparison operator ($gte instead of $lt)
  • Confusing $pull condition syntax
  • Repeating same option without change (typo)
5. Consider documents with a field items containing objects like {name: "apple", qty: 5}. How would you remove all items where qty is 0 using $pull?
hard
A. db.collection.updateMany({}, {$pull: {items: {qty: {$ne: 0}}}})
B. db.collection.updateMany({}, {$pull: {items: {qty: 0}}})
C. db.collection.updateMany({}, {$pull: {items: {name: "apple"}}})
D. db.collection.updateMany({}, {$pull: {items: {qty: {$gt: 0}}}})

Solution

  1. Step 1: Identify the condition to remove items with qty 0

    We want to remove array elements where the field qty equals 0.
  2. Step 2: Use $pull with a query object matching qty: 0

    The correct syntax is {$pull: {items: {qty: 0}}} which removes all objects with qty 0.
  3. Final Answer:

    db.collection.updateMany({}, {$pull: {items: {qty: 0}}}) -> Option B
  4. Quick Check:

    Match exact condition inside $pull to remove objects [OK]
Hint: Use $pull with object condition to remove matching objects [OK]
Common Mistakes:
  • Removing by wrong field (like name instead of qty)
  • Using $ne or $gt incorrectly inside $pull
  • Confusing $pull with $push or $pop