- MongoDB Driver
- Getting Started
- Quick Tour
MongoDB Driver Quick Tour
The following code snippets come from the QuickTour.java
example code
that can be found with the driver source.
Note
See the installation guide for instructions on how to install the MongoDB Driver.
Make a Connection
The following example shows five ways to connect to the
database mydb
on the local machine. If the database does not exist, MongoDB
will create it for you.
// To directly connect to a single MongoDB server
// (this will not auto-discover the primary even if it's a member of a replica set)
MongoClient mongoClient = new MongoClient();
// or
MongoClient mongoClient = new MongoClient( "localhost" );
// or
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// or, to connect to a replica set, with auto-discovery of the primary, supply a seed list of members
MongoClient mongoClient = new MongoClient(
Arrays.asList(new ServerAddress("localhost", 27017),
new ServerAddress("localhost", 27018),
new ServerAddress("localhost", 27019)));
// or use a connection string
MongoClientURI connectionString = new MongoClientURI("mongodb://localhost:27017,localhost:27018,localhost:27019");
MongoClient mongoClient = new MongoClient(connectionString);
MongoDatabase database = mongoClient.getDatabase("mydb");
At this point, the database
object will be a connection to a MongoDB
server for the specified database.
MongoClient
The MongoClient
instance actually represents a pool of connections
to the database; you will only need one instance of class
MongoClient
even with multiple threads.
important
Typically you only create one MongoClient
instance for a given database
cluster and use it across your application. When creating multiple instances:
- All resource usage limits (max connections, etc) apply per
MongoClient
instance - To dispose of an instance, make sure you call
MongoClient.close()
to clean up resources
Get a Collection
To get a collection to operate upon, specify the name of the collection to
the getCollection()
method:
The following example gets the collection test
:
MongoCollection<Document> collection = database.getCollection("test");
Insert a Document
Once you have the collection object, you can insert documents into the
collection. For example, consider the following JSON document; the document
contains a field info
which is an embedded document:
{
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"info" : {
x : 203,
y : 102
}
}
To create the document using the Java driver, use the
Document
class. You
can use this class to create the embedded document as well.
Document doc = new Document("name", "MongoDB")
.append("type", "database")
.append("count", 1)
.append("info", new Document("x", 203).append("y", 102));
To insert the document into the collection, use the insertOne()
method.
collection.insertOne(doc);
Add Multiple Documents
To add multiple documents, you can use the insertMany()
method.
The following example will add multiple documents of the form:
{ "i" : value }
Create the documents in a loop.
List<Document> documents = new ArrayList<Document>();
for (int i = 0; i < 100; i++) {
documents.add(new Document("i", i));
}
To insert these documents to the collection, pass the list of documents to the
insertMany()
method.
collection.insertMany(documents);
Count Documents in A Collection
Now that we’ve inserted 101 documents (the 100 we did in the loop, plus
the first one), we can check to see if we have them all using the
count()
method. The following code should print 101
.
System.out.println(collection.count());
Query the Collection
Use the
find()
method to query the collection.
Find the First Document in a Collection
To get the first document in the collection, call the
first()
method on the find()
operation. collection.find().first()
returns the first document or null rather than a cursor.
This is useful for queries that should only match a single document, or if you are
interested in the first document only.
The following example prints the first document found in the collection.
Document myDoc = collection.find().first();
System.out.println(myDoc.toJson());
The example should print the following document:
{ "_id" : { "$oid" : "551582c558c7b4fbacf16735" },
"name" : "MongoDB", "type" : "database", "count" : 1,
"info" : { "x" : 203, "y" : 102 } }
Note
The _id
element has been added automatically by MongoDB to your
document and your value will differ from that shown. MongoDB reserves field
names that start with
“_” and “$” for internal use.
Find All Documents in a Collection
To retrieve all the documents in the collection, we will use the
find()
method. The find()
method returns a FindIterable
instance that
provides a fluent interface for chaining or controlling find operations. Use the
iterator()
method to get an iterator over the set of documents that matched the
query and iterate. The following code retrieves all documents in the collection
and prints them out (101 documents):
MongoCursor<Document> cursor = collection.find().iterator();
try {
while (cursor.hasNext()) {
System.out.println(cursor.next().toJson());
}
} finally {
cursor.close();
}
Although the following idiom is permissible, its use is discouraged as the application can leak a cursor if the loop terminates early:
for (Document cur : collection.find()) {
System.out.println(cur.toJson());
}
Get A Single Document with a Query Filter
We can create a filter to pass to the find() method to get a subset of the documents in our collection. For example, if we wanted to find the document for which the value of the “i” field is 71, we would do the following:
import static com.mongodb.client.model.Filters.*;
myDoc = collection.find(eq("i", 71)).first();
System.out.println(myDoc.toJson());
and it should just print just one document
{ "_id" : { "$oid" : "5515836e58c7b4fbc756320b" }, "i" : 71 }
Note
Use the Filters
, Sorts
,
Projections
and Updates
helpers for simple and concise ways of building up queries.
Get a Set of Documents with a Query
We can use the query to get a set of documents from our collection. For
example, if we wanted to get all documents where "i" > 50
, we could
write:
// now use a range query to get a larger subset
Block<Document> printBlock = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
};
collection.find(gt("i", 50)).forEach(printBlock);
Notice we use the forEach
method on FindIterable
which applies a block to each
document and we print all documents where i > 50
.
We could also get a range, say 50 < i <= 100
:
collection.find(and(gt("i", 50), lte("i", 100))).forEach(printBlock);
Sorting documents
We can also use the Sorts
helpers to sort documents.
We add a sort to a find query by calling the sort()
method on a FindIterable
. Below we use the
exists()
helper and sort
descending("i")
helper to
sort our documents:
myDoc = collection.find(exists("i")).sort(descending("i")).first();
System.out.println(myDoc.toJson());
Projecting fields
Sometimes we don’t need all the data contained in a document, the Projections
helpers help build the projection parameter for the find operation. Below we’ll sort the collection, exclude the _id
field by using the
Projections.excludeId
and output the first matching document:
myDoc = collection.find().projection(excludeId()).first();
System.out.println(myDoc.toJson());
Aggregations
Sometimes we need to aggregate the data stored in MongoDB. The Aggregates
helper provides
builders for each of type of aggregation stage.
Below we’ll do a simple two step transformation that will calculate the value of i * 10
. First we find all Documents
where i > 0
by using the Aggregates.match
helper. Then we reshape the document by using Aggregates.project
in conjunction with the $multiply
operator to calculate the “ITimes10
”
value:
collection.aggregate(asList(
match(gt("i", 0)),
project(Document.parse("{ITimes10: {$multiply: ['$i', 10]}}")))
).forEach(printBlock);
For $group
operations use the
Accumulators
helper for any
accumulator operations. Below we sum up all the values of
i
by using the Aggregates.group
helper in conjunction with the
Accumulators.sum
helper:
myDoc = collection.aggregate(singletonList(group(null, sum("total", "$i")))).first();
System.out.println(myDoc.toJson());
Note
Currently, there are no helpers for aggregation expressions.
Use the Document.parse()
helper to quickly build aggregation expressions from extended JSON.
Updating documents
There are numerous update operators supported by MongoDB.
To update at most a single document (may be 0 if none match the filter), use the updateOne
method to specify the filter and the update document. Here we use the Updates.set
helper to update the first document that meets the filter i
equals 10
and set the value of i
to 110
:
collection.updateOne(eq("i", 10), set("i", 110));
To update all documents matching the filter use the updateMany
method. Here we use the Updates.inc
helper to increment the value of i
by 100
where i
is less than 100
.
UpdateResult updateResult = collection.updateMany(lt("i", 100), inc("i", 100));
System.out.println(updateResult.getModifiedCount());
The update methods return an UpdateResult
which provides information about the operation including the number of documents modified by the update.
Deleting documents
To delete at most a single document (may be 0 if none match the filter) use the deleteOne
method:
collection.deleteOne(eq("i", 110));
To delete all documents matching the filter use the deleteMany
method.
Here we delete all documents where i
is greater or equal to 100
:
DeleteResult deleteResult = collection.deleteMany(gte("i", 100));
System.out.println(deleteResult.getDeletedCount());
The delete methods return a DeleteResult
which provides information about the operation including the number of documents deleted.
Bulk operations
These new commands allow for the execution of bulk insert/update/delete operations. There are two types of bulk operations:
Ordered bulk operations.
Executes all the operation in order and error out on the first write error.
Unordered bulk operations.
Executes all the operations and reports any the errors.
Unordered bulk operations do not guarantee order of execution.
Let’s look at two simple examples using ordered and unordered operations:
// 2. Ordered bulk operation - order is guarenteed
collection.bulkWrite(
Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
new InsertOneModel<>(new Document("_id", 5)),
new InsertOneModel<>(new Document("_id", 6)),
new UpdateOneModel<>(new Document("_id", 1),
new Document("$set", new Document("x", 2))),
new DeleteOneModel<>(new Document("_id", 2)),
new ReplaceOneModel<>(new Document("_id", 3),
new Document("_id", 3).append("x", 4))));
// 2. Unordered bulk operation - no guarantee of order of operation
collection.bulkWrite(
Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
new InsertOneModel<>(new Document("_id", 5)),
new InsertOneModel<>(new Document("_id", 6)),
new UpdateOneModel<>(new Document("_id", 1),
new Document("$set", new Document("x", 2))),
new DeleteOneModel<>(new Document("_id", 2)),
new ReplaceOneModel<>(new Document("_id", 3),
new Document("_id", 3).append("x", 4))),
new BulkWriteOptions().ordered(false));
important
Use of the bulkWrite methods is not recommended when connected to pre-2.6 MongoDB servers, as this was the first server version to support bulk write commands for insert, update, and delete in a way that allows the driver to implement the correct semantics for BulkWriteResult and BulkWriteException. The methods will still work for pre-2.6 servers, but performance will suffer, as each write operation has to be executed one at a time.