Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

In this tutorial, we’ll look at performing query operations using the Document ID in MongoDB. MongoDB provides a find operator to query documents from a collection.

In this tutorial, we’ll first look at querying documents using Document ID in the MongoDB Shell query and then use the Java driver code.

2. What Is the Document ID of a MongoDB Document?

Just like any other database management system, MongoDB requires a unique identifier for each document stored in a collection. This unique identifier acts as a primary key to the collection.

In MongoDB, the ID is composed of 12 bytes:

  • a 4-byte timestamp that represents ID’s creation measured in seconds since the Unix epoch
  • a 5-byte random generated value that is unique to the machine and process
  • a 3-byte incrementing counter

In MongoDB, the ID is stored in a field named _id and is generated by the client. Hence, the ID should be generated before sending the document to the database. On the client side, we can either use a driver-generated ID or generate a custom ID.

The unique identifier is stored in the ObjectId class. This class provides convenience methods to get data stored in the ID without actually parsing it. MongoDB will add the _id field and assign a unique ObjectId for the document if the _id is not specified while inserting documents.

3. Database Initialization

Firstly, let’s set up a new database baeldung and a sample collection, vehicle:

use baeldung;
db.createCollection("vehicle");

Further, let’s add a few documents into the collection by using the insertMany method:

db.vehicle.insertMany([
{
    "companyName":"Skoda", 
    "modelName":"Octavia",
    "launchYear":2016,
    "type":"Sports",
    "registeredNo":"SKO 1134"
},
{ 
    "companyName":"BMW",
    "modelName":"X5",
    "launchYear":2020,
    "type":"SUV",
    "registeredNo":"BMW 3325"
},
{
    "companyName":"Mercedes",
    "modelName":"Maybach",
    "launchYear":2021,
    "type":"Luxury",
    "registeredNo":"MER 9754"
}]);

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

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("62d01d17cdd1b7c8a5f945b9"),
        ObjectId("62d01d17cdd1b7c8a5f945ba"),
        ObjectId("62d01d17cdd1b7c8a5f945bb")
    ]
}

We have successfully set up the database and collection. We’ll use this database and collection for all the examples.

4. Using the MongoDB Shell

We will make use of the db.collection.find(query, projection) method to query documents from MongoDB.

Firstly, let’s write a query that would return all the vehicle collection documents:

db.vehicle.find({});

The above query returns all the documents:

{ "_id" : ObjectId("62d01d17cdd1b7c8a5f945b9"), "companyName" : "Skoda",
    "modelName" : "Octavia", "launchYear" : 2016, "type" : "Sports", "registeredNo" : "SKO 1134" }
{ "_id" : ObjectId("62d01d17cdd1b7c8a5f945ba"), "companyName" : "BMW",
    "modelName" : "X5", "launchYear" : 2020, "type" : "SUV", "registeredNo" : "BMW 3325" }
{ "_id" : ObjectId("62d01d17cdd1b7c8a5f945bb"), "companyName" : "Mercedes",
    "modelName" : "Maybach", "launchYear" : 2021, "type" : "Luxury", "registeredNo" : "MER 9754" }

Further, let’s write a query to fetch the vehicle collection document using the ID returned in the results above:

db.vehicle.find(
{
    "_id": ObjectId("62d01d17cdd1b7c8a5f945b9")
});

The above query returns vehicle collection document with _id equal to ObjectId(“62d01d17cdd1b7c8a5f945b9”):

{ "_id" : ObjectId("62d01d17cdd1b7c8a5f945b9"), "companyName" : "Skoda",
    "modelName" : "Octavia", "launchYear" : 2016, "type" : "Sports", "registeredNo" : "SKO 1134" }

Moreover, we can retrieve multiple vehicle collection documents using IDs with the in query operator:

db.vehicle.find(
{
    "_id": {
        $in: [
            ObjectId("62d01d17cdd1b7c8a5f945b9"),
            ObjectId("62d01d17cdd1b7c8a5f945ba"),
            ObjectId("62d01d17cdd1b7c8a5f945bb")
        ]
    }
});

The above query returns all vehicle collection documents for the queried IDs in the in operator:

{ "_id" : ObjectId("62d01d17cdd1b7c8a5f945b9"), "companyName" : "Skoda",
    "modelName" : "Octavia", "launchYear" : 2016, "type" : "Sports", "registeredNo" : "SKO 1134" }
{ "_id" : ObjectId("62d01d17cdd1b7c8a5f945ba"), "companyName" : "BMW",
    "modelName" : "X5", "launchYear" : 2020, "type" : "SUV", "registeredNo" : "BMW 3325" }
{ "_id" : ObjectId("62d01d17cdd1b7c8a5f945bb"), "companyName" : "Mercedes",
    "modelName" : "Maybach", "launchYear" : 2021, "type" : "Luxury", "registeredNo" : "MER 9754" }

Likewise, any of the query operators can be used as a filter for the find() method with IDs to be queried.

Also, it is important to note that while querying documents with the _id field, the Document ID string value should be specified as an ObjectId() and not a String.

Let’s try to query an existing document with ID as a String value:

db.vehicle.find(
{
    "_id": "62d01d17cdd1b7c8a5f945b9"
});

Unfortunately, the above query would not return any documents as there does not exist any document with ID as String value 62d01d17cdd1b7c8a5f945b9.

5. Using the Java Driver

So far, we’ve learned how to query documents using ID with the MongoDB Shell. Let’s now implement the same using the MongoDB Java driver.

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

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

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

Firstly, let’s write the code to query documents using ID:

Bson filter = Filters.eq("_id", new ObjectId("62d01d17cdd1b7c8a5f945b9"));
FindIterable<Document> documents = collection.find(filter);

MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
    System.out.println(cursor.next());
}

Here, we pass a Bson filter as a parameter to the find() method with the _id field to query. The above snippet would return vehicle collection document where the _id equals ObjectId(“62d01d17cdd1b7c8a5f945b9”).

Further, let’s write a snippet to query documents with multiple IDs:

Bson filter = Filters.in("_id", new ObjectId("62d01d17cdd1b7c8a5f945b9"),
  new ObjectId("62d01d17cdd1b7c8a5f945ba"));
FindIterable<Document> documents = collection.find(filter);

MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
    System.out.println(cursor.next());
}

The above query returns all vehicle collection documents for the queried IDs.

Finally, let’s try to query the vehicle collection with a driver-generated ID:

Bson filter = Filters.eq("_id", new ObjectId());
FindIterable<Document> documents = collection.find(filter);

MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
    System.out.println(cursor.next());
}

The above query would not return any documents as a document with the newly generated ID would not exist in the vehicle collection.

6. Conclusion

In this article, we’ve learned to query documents using Document ID in MongoDB. At first, we looked into these use cases in the MongoDB Shell query, and then we discussed the corresponding Java driver code.

The implementations of all these examples and code snippets are available over on GitHub.

Course – LSD (cat=Persistence)

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

>> CHECK OUT THE COURSE
res – Persistence (eBook) (cat=Persistence)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.