If you have a collection of documents in MongoDB that contain arrays, you can add new values to those arrays if required.
Depending on your specific requirements, you can use the $push operator or the $addToSet operator.
The $push Operator
Suppose we have a collection called products with the following documents:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] }
{ "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L" ] }
And let’s say we want to append a value to the array in document 3.
We can use $push in conjunction with update() to append the value:
db.products.update(
{ _id: 3 },
{ $push: { sizes: "XL" } }
)
Let’s look at the collection again to verify the change:
db.products.find()
Result:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] }
{ "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L", "XL" ] }
We can see that the value XL has been added to the array in document 3.
The $push operator can also be used with various modifiers, such as $position, $sort, and $slice.
You can also add multiple values to the array by using the $each modifier.
See MongoDB $push for examples.
The $addToSet Operator
The $addToSet operator works in a similar way to $push, except for a couple of things:
- If the value you’re trying to add already exists in the array, it won’t be added.
- The
$position,$sort, and$slicemodifiers can’t be used with$addToSet.
Suppose our collection looks like this:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] }
{ "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Let’s insert multiple values to the array in document 2:
db.products.update(
{ _id: 2 },
{
$addToSet: {
sizes: {
$each: [ "XXL", "XXXL" ]
}
}
}
)
Now let’s check the collection again:
db.products.find()
Result:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] }
{ "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL", "XXL", "XXXL" ] }
{ "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
We can see that the two values were appended to the array in document 2 as expected.
This example uses the $each modifier, which you can also use with the $push operator.
I only used the $each modifier because I was adding multiple values. If I was only using one value, I could have omitted the $each modifier, and the syntax would have looked more like the above $push example.
As mentioned, if the value already exists, it won’t be added. Also, with both operators, if you add an array, the whole array will be added as a separate value within the existing array.
See MongoDB $addToSet for more examples.