Of course! Here is a comprehensive guide on how to perform find operations in MongoDB using Java, covering the basics, advanced queries, and best practices.

We'll use the MongoDB Java Driver, which is the official and recommended way to interact with MongoDB from a Java application.
Prerequisites
First, you need to have the MongoDB Java Driver in your project.
For Maven Projects (pom.xml)
Add this dependency to your pom.xml file:
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.11.1</version> <!-- Check for the latest version -->
</dependency>
</dependencies>
For Gradle Projects (build.gradle)
Add this dependency to your build.gradle file:

dependencies {
implementation 'org.mongodb:mongodb-driver-sync:4.11.1' // Check for the latest version
}
Setting Up the Connection
Before you can find documents, you need to connect to your MongoDB instance.
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCollection;
import org.bson.Document;
public class MongoConnectionExample {
public static void main(String[] args) {
// Replace the connection string with your own
String uri = "mongodb://localhost:27017";
try (MongoClient mongoClient = MongoClients.create(uri)) {
// Get the database (creates it if it doesn't exist)
MongoDatabase database = mongoClient.getDatabase("myDatabase");
// Get the collection (creates it if it doesn't exist)
MongoCollection<Document> collection = database.getCollection("users");
System.out.println("Successfully connected to MongoDB and accessed collection.");
// We will perform our find operations here in the next sections
// For now, let's insert a sample document to work with
collection.insertOne(new Document("name", "Alice")
.append("age", 30)
.append("city", "New York")
.append("status", "active")
);
collection.insertOne(new Document("name", "Bob")
.append("age", 25)
.append("city", "London")
.append("status", "inactive")
);
collection.insertOne(new Document("name", "Charlie")
.append("age", 35)
.append("city", "New York")
.append("status", "active")
);
System.out.println("Sample documents inserted.");
} catch (Exception e) {
System.err.println("An error occurred: " + e.getMessage());
}
}
}
The Basic find() Operation
The core of finding documents is the find() method on a MongoCollection. This method returns a FindIterable<Document>, which you can then iterate over.
a. Finding All Documents
To get all documents in a collection, use an empty Document as the query filter.
// Find all documents in the "users" collection
FindIterable<Document> allDocuments = collection.find();
// Iterate over the results and print each document
System.out.println("\n--- All Documents ---");
for (Document doc : allDocuments) {
System.out.println(doc.toJson());
}
b. Finding Documents with a Filter (Query)
This is the most common use case. You pass a Document object to the find() method that specifies the criteria for your query.

Example 1: Equality Query Find all users from "New York".
// Create a query filter document
Document query = new Document("city", "New York");
// Find documents matching the filter
FindIterable<Document> results = collection.find(query);
System.out.println("\n--- Users from New York ---");
for (Document doc : results) {
System.out.println(doc.toJson());
}
Example 2: Querying with Multiple Conditions Find all active users who are 30 or older.
// You can chain .append() to add multiple conditions
Document query = new Document("status", "active")
.append("age", new Document("$gte", 30)); // gte = greater than or equal to
FindIterable<Document> results = collection.find(query);
System.out.println("\n--- Active users aged 30 or older ---");
for (Document doc : results) {
System.out.println(doc.toJson());
}
Common Query Operators
MongoDB has a rich set of query operators. In the Java driver, you create these using nested Document objects.
| Operator | Description | Java Driver Example |
|---|---|---|
$gt |
Greater than | new Document("age", new Document("$gt", 30)) |
$gte |
Greater than or equal | new Document("age", new Document("$gte", 30)) |
$lt |
Less than | new Document("age", new Document("$lt", 30)) |
$lte |
Less than or equal | new Document("age", new Document("$lte", 30)) |
$ne |
Not equal | new Document("status", new Document("$ne", "active")) |
$in |
Matches any of the values in an array | new Document("city", new Document("$in", Arrays.asList("New York", "London"))) |
$or |
Matches any of the conditions in an array | new Document("$or", Arrays.asList(new Document("city", "London"), new Document("age", 25))) |
$and |
Matches all of the conditions in an array | new Document("$and", Arrays.asList(...)) |
regex |
Regular expression matching | new Document("name", new Document("$regex", "A").append("$options", "i")) |
Example 3: Using $or
Find users who are either named "Bob" OR live in "London".
import java.util.Arrays;
Document query = new Document("$or", Arrays.asList(
new Document("name", "Bob"),
new Document("city", "London")
));
FindIterable<Document> results = collection.find(query);
System.out.println("\n--- Users named Bob OR living in London ---");
for (Document doc : results) {
System.out.println(doc.toJson());
}
Projecting Fields (Selecting Specific Fields)
Often, you don't need all fields from a document. You can specify which fields to include or exclude using the projection method.
// Find all users, but only return their name and city
// The second parameter to find() is the projection
Document projection = new Document("name", 1)
.append("city", 1)
.append("_id", 0); // 0 to exclude the default _id field
FindIterable<Document> results = collection.find().projection(projection);
System.out.println("\n--- Projected: Name and City only ---");
for (Document doc : results) {
System.out.println(doc.toJson());
}
Output:
{"name": "Alice", "city": "New York"}
{"name": "Bob", "city": "London"}
{"name": "Charlie", "city": "New York"}
Sorting Results
You can sort the results of your query using the sort() method. Pass it a Document where keys are field names and values are 1 (for ascending) or -1 (for descending).
// Find all users, sorted by age in descending order
Document sort = new Document("age", -1); // -1 for descending
FindIterable<Document> results = collection.find().sort(sort);
System.out.println("\n--- Users sorted by age (descending) ---");
for (Document doc : results) {
System.out.println(doc.toJson());
}
Limiting Results
To restrict the number of documents returned, use the limit() method.
// Find only the first 2 users
FindIterable<Document> results = collection.find().limit(2);
System.out.println("\n--- First 2 users ---");
for (Document doc : results) {
System.out.println(doc.toJson());
}
Putting It All Together: A Complete Example
This example combines filtering, projection, sorting, and limiting.
Goal: Find the first 2 active users in New York, returning only their name and age, sorted by age in ascending order.
import com.mongodb.client.*;
import org.bson.Document;
import java.util.Arrays;
public class CompleteFindExample {
public static void main(String[] args) {
String uri = "mongodb://localhost:27017";
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("myDatabase");
MongoCollection<Document> collection = database.getCollection("users");
// 1. Create the query filter
Document query = new Document("status", "active")
.append("city", "New York");
// 2. Create the projection
Document projection = new Document("name", 1)
.append("age", 1)
.append("_id", 0);
// 3. Create the sort criteria
Document sort = new Document("age", 1); // 1 for ascending
// 4. Chain the methods and execute the query
FindIterable<Document> results = collection.find(query)
.projection(projection)
.sort(sort)
.limit(2);
System.out.println("\n--- Final Combined Query Result ---");
for (Document doc : results) {
System.out.println(doc.toJson());
}
} catch (Exception e) {
System.err.println("An error occurred: " + e.getMessage());
}
}
}
This complete example demonstrates the power and flexibility of the MongoDB Java driver for finding data. You can chain these methods (filter(), projection(), sort(), limit()) in any order to build precise and efficient queries.
