NoSQL Top

Build a Dashboard Using Cassandra, Astra, and Stargate:

>> CHECK OUT THE ARTICLE
Persistence top

Get started with Spring Data JPA through the reference Learn Spring Data JPA course:

>> CHECK OUT THE COURSE

1. Overview

In this tutorial, we'll introduce how to insert documents into an array in MongoDB. Additionally, we'll see various applications of $push and $addToset operators to add values into an array.

First, we'll create a sample database, a collection, and insert dummy data into it. Further, we'll look into a few basic examples to update a document using the $push operator. Later, we'll also discuss the various use cases of $push and $addtoSet operators.

Let's deep dive into the various methods to insert documents into an array in MongoDB.

2. Database Initialisation

First of all, let's set up a new database baeldung and a sample collection, orders:

use baeldung;
db.createCollection(orders);

Let's now add a few documents into the collection by using the insertMany method:

db.orders.insertMany([
    {
        "customerId": 1023,
        "orderTimestamp": NumberLong("1646460073000"),
        "shippingDestination": "336, Street No.1 Pawai Mumbai",
        "purchaseOrder": 1000,
        "contactNumber":"9898987676",
        "items": [ 
            {
                "itemName": "BERGER",
                "quantity": 1,
                "price": 500
            },
            {
                "itemName": "VEG PIZZA",
                "quantity": 1,
                "price": 800
            } 
          ]
    },
    {
        "customerId": 1027,
        "orderTimestamp": NumberLong("1646460087000"),
        "shippingDestination": "445, Street No.2 Pawai Mumbai",
        "purchaseOrder": 2000,
        "contactNumber":"9898987676",
        "items": [ 
            {
               "itemName": "BERGER",
               "quantity": 1,
               "price": 500
            },
            {
               "itemName": "NON-VEG PIZZA",
               "quantity": 1,
               "price": 1200
            } 
          ]
    }
]);

In case of successful insertion, the above command will print a JSON similar to the one shown below:

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("622300cc85e943405d04b567"),
	ObjectId("622300cc85e943405d04b568")
    ]
}

Till now, we have successfully set up the database and collection. We'll use this database and collection for all the examples.

3. Push Operation Using Mongo Query

MongoDB provides various types of array operators to update the arrays in MongoDB documents. The $push operator in MongoDB appends the value at the end of the array. Depending upon the type of query, we can use the $push operator with methods like updateOne, updateMany, findAndModify, etc.

Let's now look into the shell query using the $push operator:

db.orders.updateOne(
    {
        "customerId": 1023
    },
    {
        $push: {
            "items":{
                "itemName": "PIZZA MANIA",
                "quantity": 1,
                "price": 800
            }
        }
    });

The above query will return the following document:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Let's now check the document with customerId 1023. Here, we can see that the new item is inserted at the end of the list “items“:

{
    "customerId" : 1023,
    "orderTimestamp" : NumberLong("1646460073000"),
    "shippingDestination" : "336, Street No.1 Pawai Mumbai",
    "purchaseOrder" : 1000,
    "contactNumber" : "9898987676",
    "items" : [
        {
            "itemName" : "BERGER",
            "quantity" : 1,
	    "price" : 500
        },
	{
            "itemName" : "VEG PIZZA",
	    "quantity" : 1,
	    "price" : 800
	},
	{
	    "itemName" : "PIZZA MANIA",
	    "quantity" : 1,
	    "price" : 800
        }
    ]
}

4. Push Operation Using Java Driver Code

Till now, we have discussed the MongoDB shell query to push the document into an array. Let's now implement the push update query using the Java code.

Before performing the update operation, let's first connect to the orders collection in the baeldung database:

mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("orders");

Here, in this case, we are connecting to MongoDB which is running at default port 27017 on localhost.

4.1. Using the DBObject

MongoDB Java driver provides support of both the DBObject and BSON document. Here, the DBObject is part of the MongoDB legacy driver, but it is deprecated in the newer version of the MongoDB.

Let's now look into the Java driver code to insert new values into the array:

DBObject listItem = new BasicDBObject("items", new BasicDBObject("itemName", "PIZZA MANIA")
  .append("quantity", 1)
  .append("price", 800));
BasicDBObject searchFilter = new BasicDBObject("customerId", 1023);
BasicDBObject updateQuery = new BasicDBObject();
updateQuery.append("$push", listItem);
UpdateResult updateResult = collection.updateOne(searchFilter, updateQuery);

In the above query, we first created the item document using the BasicDBObject. On the basis of searchQuery, the documents of the collection will be filtered, and the values will be pushed into the array.

4.2. Using the BSON Document

The BSON Document is the new way to access the MongoDB document in Java that is built with the newer client stack. The org.bson.Document class is less complicated and easier to use.

Let's use the org.bson.Document class to push values into the array “items”:

Document item = new Document()
  .append("itemName1", "PIZZA MANIA")
  .append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection.updateOne(Filters.eq("customerId", 1023), Updates.push("items", item));

In this case, the implementation of the BSON is similar to the code run using the DBObject, and the updation will also be the same. Here, we used the updateOne method to update only a single document.

5. Using the addToSet Operator

The $addToSet operator can also be used to push a value in the array. This operator adds values only if that value doesn't exist in the array. Otherwise, it will just ignore it. Whereas the push operator will push the value as the condition to filter get the match.

One key point to note is the $addToSet operator doesn't push the value work in the case of a duplicate item. On the other hand, the $push operator just pushes the value into the array irrespective of any other conditions.

5.1. Shell Query Using the addToSet Operator

The mongo shell query of the $addToSet operator is similar to the $push operator, but the $addToSet doesn't insert the duplicate value in the array.

Let's now check out the MongoDB query to push the values into an array using the $addToset:

db.orders.updateOne(
    {
        "customerId": 1023
    },
    {
        $addToSet: {
            "items":{
                "itemName": "PASTA",
                "quantity": 1,
                "price": 1000
            }
        }
    });

In this case, the output will be as follows:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

In this case, we used the $addToSet operator, and the document will be pushed to array “items” only if it is unique.

5.2. Java Driver Using the addToSet Operator

The $addToSet operator provides a different type of array update operation compared to the push operator:

Document item = new Document()
  .append("itemName1", "PIZZA MANIA")
  .append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection
  .updateOne(Filters.eq("customerId", 1023), Updates.addToSet("items", item));
System.out.println("updateResult:- " + updateResult);

In the above code, first, we created the document “item“, and on the basis of the customerId filter, the updateOne method will try to push the document “item” into the array “items“.

6. Conclusion

In this article, we have learned to push new values into the array using the $push and $addToSet operators. First, we looked into the use of the $push operator in MongoDB shell query, and then we discussed the corresponding Java driver code.

The implementation of all the cases can be found over on GitHub.

NoSql Bottom

Build a Dashboard Using Cassandra, Astra, and Stargate

>> CHECK OUT THE ARTICLE
Persistence bottom
Get started with Spring Data JPA through the reference Learn Spring Data JPA course: >> CHECK OUT THE COURSE
Persistence footer banner
Comments are closed on this article!