Read operations retrieve documents or information about documents from a collection. You can specify a filter to retrieve only those documents that match the filter condition.
Prerequisites
You must set up the following components to run the code examples in this guide:
A
test.restaurantscollection populated with documents from therestaurants.jsonfile in the documentation assets GitHub.The following import statements:
import com.mongodb.*; 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 com.mongodb.client.model.Projections; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Sorts; import java.util.Arrays; import org.bson.Document; import static com.mongodb.client.model.Filters.*; import static com.mongodb.client.model.Projections.*;
Important
This guide uses the Subscriber implementations, which are
described in the Quick Start Primer.
Connect to a MongoDB Deployment
First, connect to a MongoDB deployment, then declare and define
MongoDatabase and MongoCollection instances.
The following code connects to a standalone
MongoDB deployment running on localhost on port 27017. Then, it
defines the database variable to refer to the test database and
the collection variable to refer to the restaurants collection:
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
To learn more about connecting to MongoDB deployments, see the Connect to MongoDB tutorial.
Query a Collection
To query the collection, you can use the collection's find()
method.
You can call the method without any arguments to query all documents in a collection:
collection.find().subscribe(new PrintDocumentSubscriber());
Or, you can pass a filter to query for documents that match the filter criteria:
collection.find(eq("name", "456 Cookies Shop")) .subscribe(new PrintDocumentSubscriber());
Query Filters
To query for documents that match certain conditions, pass a filter
document to the find() method.
Empty Filter
To specify an empty filter and match all documents in a collection,
use an empty Document object:
collection.find(new Document()).subscribe(new PrintDocumentSubscriber());
Tip
When using the find() method, you can also call the method without
passing any filter object to match all documents in a collection.
collection.find().subscribe(new PrintDocumentSubscriber());
Filters Helper
To facilitate the creation of filter documents, the driver
provides the Filters class that provides filter condition helper
methods.
This example find operation includes a filter
Document instance which specifies the following conditions:
starsfield value is greater than or equal to2and less than5categoriesfield equals"Bakery", or ifcategoriesis an array field, contains the string"Bakery"as an element
collection.find( new Document("stars", new Document("$gte", 2) .append("$lt", 5)) .append("categories", "Bakery")).subscribe(new PrintDocumentSubscriber());
The following example specifies the same filter condition using the
Filters helper methods:
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .subscribe(new PrintDocumentSubscriber());
To view a list of query filter operators, see Query and
Projection Operators in the
Server manual. To view a list of Filters helpers, see the Filters
API documentation.
FindPublisher
The find() method returns an instance of the FindPublisher
interface. The interface provides various methods that you can chain
to the find() method to modify the output or behavior of the query,
such as sort() or projection(), as well as for iterating
the results via the subscribe() method.
Projections
By default, queries in MongoDB return all fields in matching documents. To specify the fields to return in the matching documents, you can specify a projection document.
This find operation example includes a projection
Document which specifies that the matching documents include only the
name, stars, and the categories fields:
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .projection(new Document("name", 1) .append("stars", 1) .append("categories",1) .append("_id", 0)) .subscribe(new PrintDocumentSubscriber());
To facilitate the creation of projection documents, the driver
provides the Projections class.
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .projection(fields(include("name", "stars", "categories"), excludeId())) .subscribe(new PrintDocumentSubscriber());
In the projection document, you can also specify a projection expression by using a projection operator.
To view an example that uses the Projections.metaTextScore() method, see the
Text Search tutorial.
Sorts
To sort documents, pass a sort specification document to the
FindPublisher.sort() method. The driver provides Sorts
helper methods to facilitate the creation of the sort specification document.
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .sort(Sorts.ascending("name")) .subscribe(new PrintDocumentSubscriber());
Sort with Projections
The FindPublisher methods themselves return FindPublisher
objects, and as such, you can append multiple FindPublisher methods
to the find() method:
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .sort(Sorts.ascending("name")) .projection(fields(include("name", "stars", "categories"), excludeId())) .subscribe(new PrintDocumentSubscriber());
Explain
To explain a find operation, call the FindPublisher.explain()
method:
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .explain() .subscribe(new PrintDocumentSubscriber());
Read Preference
For read operations on replica sets or sharded clusters, you can configure the read preference at the following levels:
In a
MongoClientin the following ways:By creating a
MongoClientSettingsinstance:MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://host1,host2")) .readPreference(ReadPreference.secondary()) .build()); By creating a
ConnectionStringinstance:MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?readPreference=secondary");
In a
MongoDatabaseby using thewithReadPreference()method:MongoDatabase database = mongoClient.getDatabase("test") .withReadPreference(ReadPreference.secondary()); In a
MongoCollectionby using thewithReadPreference()method:MongoCollection<Document> collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.secondary());
MongoDatabase and MongoCollection instances are immutable. Calling
withReadPreference() on an existing MongoDatabase or
MongoCollection instance returns a new instance and does not affect
the instance on which the method is called.
In the following example, the collectionWithReadPref instance
has the read preference of primaryPreferred whereas the read
preference of the collection is unaffected:
MongoCollection<Document> collectionWithReadPref = collection.withReadPreference(ReadPreference.primaryPreferred());
Read Concern
For read operations on replica sets or sharded clusters, applications can configure the read concern at the following levels:
In a
MongoClientin the following ways:By creating a
MongoClientSettingsinstance:MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://host1,host2")) .readConcern(ReadConcern.MAJORITY) .build()); By creating a
ConnectionStringinstance:MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?readConcernLevel=majority");
In a
MongoDatabaseby using thewithReadConcern()method:MongoDatabase database = mongoClient.getDatabase("test") .withReadConcern(ReadConcern.MAJORITY); In a
MongoCollectionby using thewithReadConcern()method:MongoCollection<Document> collection = database.getCollection("restaurants") .withReadConcern(ReadConcern.MAJORITY);
MongoDatabase and MongoCollection instances are immutable. Calling
withReadConcern() on an existing MongoDatabase or
MongoCollection instance returns a new instance and does not affect
the instance on which the method is called.
In the following example, the collWithReadConcern instance has
an AVAILABLE read concern whereas the read concern of the collection
is unaffected:
MongoCollection<Document> collWithReadConcern = collection.withReadConcern(ReadConcern.AVAILABLE);
You can build MongoClientSettings, MongoDatabase, or
MongoCollection instances to include combinations of read concerns, read
preferences, and write concerns.
For example, the following code sets all three at the collection level:
collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.primary()) .withReadConcern(ReadConcern.MAJORITY) .withWriteConcern(WriteConcern.MAJORITY);