- Reactive Streams
- Tutorials
- Databases and Collections
Databases and Collections
MongoDB stores documents in collections; the collections in databases.
Prerequisites
Include following import statements:
import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoCollection; import com.mongodb.reactivestreams.client.MongoDatabase; import static com.mongodb.client.model.Filters.*; import com.mongodb.client.model.CreateCollectionOptions; import com.mongodb.client.model.ValidationOptions;
important
This guide uses the Subscriber
implementations as covered in the Quick Start Primer.
Connect to a MongoDB Deployment
Connect to a running MongoDB deployment.
For example, include the following code to connect to a standalone MongoDB deployment running on localhost on port 27017
.
MongoClient mongoClient = MongoClients.create();
For more information on connecting to running MongoDB deployments, see Connect to MongoDB.
Access a Database
Once you have a MongoClient
instance connected to a MongoDB deployment, use its getDatabase()
method to access a database.
Specify the name of the database to the getDatabase()
method. If a database does not exist, MongoDB creates the database when you first store data for that database.
The following example accesses the test
database:
MongoDatabase database = mongoClient.getDatabase("test");
Note
MongoDatabase
instances are immutable.
Access a Collection
Once you have a MongoDatabase
instance, use its getCollection()
method to access a collection.
Specify the name of the collection to the getCollection()
method.
For example, using the database
instance, the following statement accesses the collection named myTestCollection
:
MongoCollection<Document> coll = database.getCollection("myTestCollection");
Note
MongoCollection
instances are immutable.
If a collection does not exist, MongoDB creates the collection when you first store data for that collection.
You can also explicitly create a collection with various options, such as setting the maximum size or the documentation validation rules.
Explicitly Create a Collection
The MongoDB driver provides the createCollection()
method to explicitly create a collection. When you explicitly create a collection, you can specify various collection options, such as a maximum size or the documentation validation rules, with the CreateCollectionOptions
class. If you are not specifying these options, you do not need to explicitly create the collection since MongoDB creates new collections when you first store data for the collections.
Capped Collection
For example, the following operation creates a capped collection sized to 1 megabyte:
database.createCollection("cappedCollection", new CreateCollectionOptions().capped(true).sizeInBytes(0x100000))
.subscribe(new OperationSubscriber<Void>());
Document Validation
MongoDB provides the capability to validate documents during updates and insertions. Validation rules are specified on a per-collection basis using the ValidationOptions
, which takes a filter document that specifies the validation rules or expressions.
ValidationOptions collOptions = new ValidationOptions().validator(
Filters.or(Filters.exists("email"), Filters.exists("phone")));
database.createCollection("contacts", new CreateCollectionOptions().validationOptions(collOptions))
.subscribe(new OperationSubscriber<Void>());
Get A List of Collections
You can get a list of the collections in a database using the MongoDatabase.listCollectionNames()
method:
database.listCollectionNames().subscribe(new PrintToStringSubscriber<String>());
Drop a Collection
You can drop a collection by using the MongoCollection.drop()
method:
MongoCollection<Document> collection = database.getCollection("contacts");
collection.drop().subscribe(new OperationSubscriber<Void>());
Immutability
MongoDatabase
and MongoCollection
instances are immutable. To create new instances from existing instances that
have different property values, such as read concern, read preference, and write concern, the MongoDatabase
and MongoCollection
class provides various methods:
For details, see Read Operations and Write Operations.
CodecRegistry
An overload of the getCollection
method allows clients to specify a different class for representing BSON documents. For example,
users may wish to use the strict and typesafe BsonDocument
class with the CRUD API:
// Pass BsonDocument.class as the second argument
MongoCollection<BsonDocument> collection = database.getCollection("mycoll", BsonDocument.class);
// insert a document
BsonDocument document = BsonDocument.parse("{x: 1}");
collection.insertOne(document).subscribe(new OperationSubscriber<Void>());
document.append("x", new BsonInt32(2)).append("y", new BsonInt32(3));
// replace a document
collection.replaceOne(Filters.eq("_id", document.get("_id")), document)
.subscribe(new PrintSubscriber<UpdateResult>("Update Result: %s"));
// find documents
collection.find().subscribe(new PrintDocumentSubscriber());
There are two requirements that must be met for any class used in this way:
- a
Codec
for it must be registered in theMongoCollection
’sCodecRegistry
- the
Codec
must be one that encodes and decodes a full BSON document (and not just, for example, a single BSON value like an Int32)
By default, a MongoCollection
is configured with Codec
s for three classes:
Document
BsonDocument
BasicDBObject
Applications, however, are free to register Codec
implementations for other classes by customizing the CodecRegistry
. New
CodecRegistry
instances are configurable at three levels:
- In a
MongoClient
viaMongoClientSettings
- In a
MongoDatabase
via itswithCodecRegistry
method - In a
MongoCollection
via itswithCodecRegistry
method
Consider the case of encoding and decoding instances of the UUID
class. The Java driver by default encodes instances of UUID
using a
byte ordering that is not compatible with other MongoDB drivers, and changing the default would be quite dangerous. But it is
possible for new applications that require interoperability across multiple drivers to be able to change that default, and they can do
that with a CodecRegistry
.
// Replaces the default UuidCodec with one that uses the new standard UUID representation
CodecRegistry codecRegistry =
CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new UuidCodec(UuidRepresentation.STANDARD)),
MongoClientSettings.getDefaultCodecRegistry());
// globally
MongoClientSettings settings = MongoClientSettings.builder()
.codecRegistry(codecRegistry).build();
MongoClient client = MongoClients.create(settings);
// or per database
MongoDatabase database = client.getDatabase("mydb")
.withCodecRegistry(codecRegistry);
// or per collection
MongoCollection<Document> collection = database.getCollection("mycoll")
.withCodecRegistry(codecRegistry);