Bird
Raised Fist0
MongoDBquery~5 mins

$addToSet for unique array additions 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

$addToSet helps you add items to an array only if they are not already there. It keeps the array unique without duplicates.

When you want to add a new tag to a list of tags but avoid duplicates.
When you keep track of user IDs who liked a post and want to add a new user only once.
When you store unique email addresses in a contact list and want to add new ones safely.
When you update a product's categories and want to add a category only if it is not already assigned.
Syntax
MongoDB
db.collection.updateOne(
  { <filter> },
  { $addToSet: { <arrayField>: <valueToAdd> } }
)

filter selects the document to update.

arrayField is the name of the array you want to add to.

Examples
Adds "reading" to Alice's hobbies only if it is not already there.
MongoDB
db.users.updateOne(
  { name: "Alice" },
  { $addToSet: { hobbies: "reading" } }
)
Adds "swimming" and "cycling" to Bob's hobbies, each only if not already present.
MongoDB
db.users.updateOne(
  { name: "Bob" },
  { $addToSet: { hobbies: { $each: ["swimming", "cycling"] } } }
)
If Charlie has no hobbies array, this creates it and adds "chess".
MongoDB
db.users.updateOne(
  { name: "Charlie" },
  { $addToSet: { hobbies: "chess" } }
)
Sample Program

This program creates a user Diana with two hobbies. It tries to add "jogging" again but it won't duplicate. Then it adds "photography" and tries to add "painting" again. Finally, it prints the document before and after updates.

MongoDB
use testdb

// Insert a sample user document
db.users.insertOne({ name: "Diana", hobbies: ["painting", "jogging"] })

// Show initial document
print("Before update:")
printjson(db.users.findOne({ name: "Diana" }))

// Add a new hobby "jogging" (already exists) - should not add duplicate
// Add a new hobby "photography" (new) - should add

// Update with $addToSet for single value
db.users.updateOne(
  { name: "Diana" },
  { $addToSet: { hobbies: "jogging" } }
)

// Update with $addToSet and $each for multiple values
db.users.updateOne(
  { name: "Diana" },
  { $addToSet: { hobbies: { $each: ["photography", "painting"] } } }
)

// Show updated document
print("After update:")
printjson(db.users.findOne({ name: "Diana" }))
OutputSuccess
Important Notes

$addToSet only adds the value if it is not already in the array, so it prevents duplicates.

Using $each inside $addToSet lets you add multiple unique values at once.

If the array field does not exist, $addToSet creates it with the new value.

Summary

$addToSet keeps arrays unique by adding only new values.

Use $each with $addToSet to add multiple unique items at once.

It is useful to avoid duplicate entries in arrays in MongoDB documents.

Practice

(1/5)
1. What is the main purpose of the $addToSet operator in MongoDB?
easy
A. To sort the elements of an array
B. To remove duplicate values from an array
C. To replace an entire array with a new value
D. To add a value to an array only if it does not already exist

Solution

  1. Step 1: Understand the purpose of $addToSet

    $addToSet adds a value to an array only if that value is not already present, ensuring uniqueness.
  2. Step 2: Compare with other array operations

    Unlike operators that remove duplicates or replace arrays, $addToSet only adds unique values without duplicates.
  3. Final Answer:

    To add a value to an array only if it does not already exist -> Option D
  4. Quick Check:

    $addToSet ensures unique additions [OK]
Hint: Remember: $addToSet adds only new unique values [OK]
Common Mistakes:
  • Confusing $addToSet with $push which adds duplicates
  • Thinking $addToSet removes duplicates from existing array
  • Assuming $addToSet sorts the array
2. Which of the following is the correct syntax to add multiple unique values to an array field tags using $addToSet?
easy
A. { $addToSet: { tags: { $each: ["mongodb", "database"] } } }
B. { $addToSet: { tags: ["mongodb", "database"] } }
C. { $addToSet: { tags: { $push: ["mongodb", "database"] } } }
D. { $push: { tags: { $each: ["mongodb", "database"] } } }

Solution

  1. Step 1: Recall syntax for adding multiple unique values

    To add multiple unique values with $addToSet, use $each inside it.
  2. Step 2: Analyze options

    { $addToSet: { tags: { $each: ["mongodb", "database"] } } } correctly uses $addToSet with $each to add multiple unique values. { $addToSet: { tags: ["mongodb", "database"] } } lacks $each, so it tries to add an array as a single element. Using $push inside or instead of $addToSet is incorrect as it doesn't ensure uniqueness.
  3. Final Answer:

    { $addToSet: { tags: { $each: ["mongodb", "database"] } } } -> Option A
  4. Quick Check:

    Use $addToSet with $each for multiple unique additions [OK]
Hint: Use $each inside $addToSet to add multiple unique items [OK]
Common Mistakes:
  • Omitting $each when adding multiple values
  • Using $push instead of $addToSet for uniqueness
  • Adding an array as a single element instead of multiple
3. Given the document { _id: 1, colors: ["red", "blue"] }, what will be the colors array after running this update?
{ $addToSet: { colors: "blue" } }
medium
A. ["red", "blue", "blue"]
B. ["red", "blue"]
C. ["blue"]
D. ["red"]

Solution

  1. Step 1: Understand $addToSet behavior with existing value

    The value "blue" already exists in the array, so $addToSet will not add it again.
  2. Step 2: Determine the resulting array

    Since "blue" is present, the array remains unchanged as ["red", "blue"].
  3. Final Answer:

    ["red", "blue"] -> Option B
  4. Quick Check:

    Existing values are not duplicated by $addToSet [OK]
Hint: If value exists, $addToSet does not add it again [OK]
Common Mistakes:
  • Assuming $addToSet always appends the value
  • Confusing $addToSet with $push which allows duplicates
  • Thinking the array will be replaced
4. You want to add multiple unique tags to a document's tags array, but your update query:
{ $addToSet: { tags: ["nodejs", "mongodb"] } }
adds the entire array as one element instead of separate tags. What is the fix?
medium
A. Use $addToSet: { tags: { $each: ["nodejs", "mongodb"] } }
B. Use $push: { tags: ["nodejs", "mongodb"] }
C. Use $addToSet: { tags: "nodejs", "mongodb" }
D. Use $addToSet: { tags: { $push: ["nodejs", "mongodb"] } }

Solution

  1. Step 1: Identify the problem with adding an array directly

    Adding an array directly with $addToSet adds it as a single element, not multiple elements.
  2. Step 2: Use $each to add multiple unique elements

    Wrapping the array with $each inside $addToSet adds each element uniquely.
  3. Final Answer:

    Use $addToSet: { tags: { $each: ["nodejs", "mongodb"] } } -> Option A
  4. Quick Check:

    Use $each inside $addToSet for multiple unique additions [OK]
Hint: Wrap multiple values with $each inside $addToSet [OK]
Common Mistakes:
  • Adding array directly without $each
  • Using $push instead of $addToSet for uniqueness
  • Incorrect syntax with multiple keys inside $addToSet
5. You have a MongoDB document:
{ _id: 1, items: ["apple", "banana"] }
You want to add the items ["banana", "cherry", "apple", "date"] uniquely to the items array. Which update query will correctly add only the new unique items?
hard
A. { $addToSet: { items: ["banana", "cherry", "apple", "date"] } }
B. { $set: { items: ["banana", "cherry", "apple", "date"] } }
C. { $addToSet: { items: { $each: ["banana", "cherry", "apple", "date"] } } }
D. { $push: { items: { $each: ["banana", "cherry", "apple", "date"] } } }

Solution

  1. Step 1: Understand the goal to add only new unique items

    We want to add only items not already in the array, so duplicates like "banana" and "apple" should not be added again.
  2. Step 2: Choose the correct operator and syntax

    Using $addToSet with $each adds multiple unique items. { $addToSet: { items: { $each: ["banana", "cherry", "apple", "date"] } } } correctly uses this syntax. { $addToSet: { items: ["banana", "cherry", "apple", "date"] } } adds the entire array as one element. { $push: { items: { $each: ["banana", "cherry", "apple", "date"] } } } uses $push which allows duplicates. { $set: { items: ["banana", "cherry", "apple", "date"] } } replaces the entire array, losing existing items.
  3. Final Answer:

    { $addToSet: { items: { $each: ["banana", "cherry", "apple", "date"] } } } -> Option C
  4. Quick Check:

    $addToSet with $each adds only new unique items [OK]
Hint: Use $addToSet with $each to add multiple unique items without duplicates [OK]
Common Mistakes:
  • Adding array directly without $each causing one element addition
  • Using $push which allows duplicates
  • Replacing array with $set losing existing data