読み取り操作は、コレクションからドキュメントまたはドキュメントに関する情報を取得します。 フィルターを指定して、フィルター条件に一致するドキュメントのみを検索できます。
前提条件
このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。
test.restaurantsドキュメントrestaurants.jsonアセットGithubの ファイルのドキュメントが入力された コレクション。次のインポート ステートメントは次のとおりです。
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.*;
重要
このガイドでは、 クイック スタート プライマリで説明されているSubscriberの実装を使用します。
MongoDB 配置への接続
まず、MongoDB 配置に接続し、 インスタンスとMongoDatabase MongoCollectionインスタンスを 宣言して定義します。
次のコードは、ポート27017のlocalhostで実行されているスタンドアロンの MongoDB 配置に接続します。 次に、 testデータベースを参照するためのdatabase変数と、 restaurantsコレクションを参照するためのcollection変数を定義します。
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
MongoDB 配置への接続の詳細については、「 MongoDB への接続」チュートリアルを参照してください。
コレクションのクエリ
コレクションをクエリするには、コレクションのfind()メソッドを使用できます。
引数なしで メソッドを呼び出して、コレクション内のすべてのドキュメントをクエリできます。
collection.find().subscribe(new PrintDocumentSubscriber());
または、フィルターを渡して、フィルター条件に一致するドキュメントをクエリすることもできます。
collection.find(eq("name", "456 Cookies Shop")) .subscribe(new PrintDocumentSubscriber());
クエリフィルター
特定の条件に一致するドキュメントをクエリするには、フィルター ドキュメントをfind()メソッドに渡します。
空のフィルター
空のフィルターを指定して、コレクション内のすべてのドキュメントを一致させるには、空のDocumentオブジェクトを使用します。
collection.find(new Document()).subscribe(new PrintDocumentSubscriber());
Tip
find()メソッドを使用する場合、コレクション内のすべてのドキュメントに一致するようにフィルター オブジェクトを渡せずに メソッドを呼び出すこともできます。
collection.find().subscribe(new PrintDocumentSubscriber());
フィルター ヘルパー
フィルター ドキュメントの作成を容易にするために、ドライバーはフィルター条件ヘルパー メソッドを提供するFiltersクラスを提供します。
この検索操作には、次の条件を指定するフィルターDocumentインスタンスが含まれています。
starsフィールド値は2以上で5未満ですcategoriesフィールドは"Bakery"と等しい、またはcategoriesが配列フィールドである場合は、string"Bakery"が要素として含まれます
collection.find( new Document("stars", new Document("$gte", 2) .append("$lt", 5)) .append("categories", "Bakery")).subscribe(new PrintDocumentSubscriber());
次の例では、 Filtersヘルパー メソッドを使用して同じフィルター条件を指定しています。
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .subscribe(new PrintDocumentSubscriber());
クエリフィルター演算子のリストを表示するには、サーバー マニュアルの「クエリ 演算子とプロジェクション 演算子」を参照してください。Filters ヘルパーのリストを表示するには、フィルターAPIドキュメント を参照してください。
FindPublisher
find()メソッドはFindPublisherインターフェースのインスタンスを返します。 インターフェースは、 find()メソッドに連結して、 sort()やprojection()などのクエリの出力や動作を変更したり、 subscribe()メソッドを介して結果を反復処理したりするためのさまざまなメソッドを提供します。
プロジェクション
デフォルトでは、MongoDB のクエリは一致するドキュメント内のすべてのフィールドを返します。 一致するドキュメントで返されるフィールドを指定するには、 プロジェクション ドキュメントを指定できます。
この検索操作の例には、一致するドキュメントにname 、 stars 、およびcategoriesフィールドのみが含まれることを指定する プロジェクションDocumentが含まれています。
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());
プロジェクション ドキュメントの作成を容易にするために、ドライバーはProjectionsクラスを提供します。
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .projection(fields(include("name", "stars", "categories"), excludeId())) .subscribe(new PrintDocumentSubscriber());
プロジェクション ドキュメントでは、 プロジェクション演算子を使用してプロジェクション式を指定することもできます。
Projections.metaTextScore()メソッドを使用する例については、テキスト検索のチュートリアル を参照してください。
ソート
ドキュメントを並べ替えるには、並べ替え仕様ドキュメントをFindPublisher.sort()メソッドに渡します。 このドライバーは、並べ替え仕様ドキュメントの作成を容易にするためのSortsヘルパー メソッドを提供します。
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .sort(Sorts.ascending("name")) .subscribe(new PrintDocumentSubscriber());
プロジェクションによるソート
FindPublisherメソッド自体はFindPublisherオブジェクトを返すため、 find()メソッドに複数のFindPublisherメソッドを追加できます。
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
検索操作を説明するには、 FindPublisher.explain()メソッドを呼び出します。
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .explain() .subscribe(new PrintDocumentSubscriber());
読み込み設定 (read preference)
レプリカセットまたはシャーディングされたクラスターに対する読み取り操作の場合、次のレベルで読み込み設定(read preference)を構成できます。
次の方法で
MongoClientで実行されます。MongoClientSettingsインスタンスを作成する方法MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://host1,host2")) .readPreference(ReadPreference.secondary()) .build()); ConnectionStringインスタンスを作成する方法MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?readPreference=secondary");
MongoDatabaseでwithReadPreference()メソッドを使用することで、MongoDatabase database = mongoClient.getDatabase("test") .withReadPreference(ReadPreference.secondary()); MongoCollectionでwithReadPreference()メソッドを使用することで、MongoCollection<Document> collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.secondary());
MongoDatabase とMongoCollectionインスタンスは不変です。 既存のMongoDatabaseまたはMongoCollectionインスタンスでwithReadPreference()を呼び出すと、新しい インスタンスが返されますが、メソッドが呼び出されるインスタンスには影響しません。
次の例では、 collectionWithReadPrefインスタンスの読み込み設定(read preference)はprimaryPreferredですが、 collectionの読み込み設定(read preference)は影響を受けません。
MongoCollection<Document> collectionWithReadPref = collection.withReadPreference(ReadPreference.primaryPreferred());
読み取り保証(read concern)
レプリカセットまたはシャーディングされたクラスターに対する読み取り操作の場合、アプリケーションは次のレベルで読み取り保証を構成できます。
次の方法で
MongoClientで実行されます。MongoClientSettingsインスタンスを作成する方法MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://host1,host2")) .readConcern(ReadConcern.MAJORITY) .build()); ConnectionStringインスタンスを作成する方法MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?readConcernLevel=majority");
MongoDatabaseでwithReadConcern()メソッドを使用することで、MongoDatabase database = mongoClient.getDatabase("test") .withReadConcern(ReadConcern.MAJORITY); MongoCollectionでwithReadConcern()メソッドを使用することで、MongoCollection<Document> collection = database.getCollection("restaurants") .withReadConcern(ReadConcern.MAJORITY);
MongoDatabase とMongoCollectionインスタンスは不変です。 既存のMongoDatabaseまたはMongoCollectionインスタンスでwithReadConcern()を呼び出すと、新しい インスタンスが返されますが、メソッドが呼び出されるインスタンスには影響しません。
次の例では、 collWithReadConcernインスタンスにはAVAILABLEの読み取り保証がありますが、 collectionの読み取り保証には影響がありません。
MongoCollection<Document> collWithReadConcern = collection.withReadConcern(ReadConcern.AVAILABLE);
MongoClientSettings 、 MongoDatabase 、またはMongoCollectionインスタンスをビルドすると、読み取り保証、読み込み設定(read preference)、書込み保証(write concern)の組み合わせを含めることができます。
たとえば、次のコードでは、コレクション レベルで 3 つすべてを設定します。
collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.primary()) .withReadConcern(ReadConcern.MAJORITY) .withWriteConcern(WriteConcern.MAJORITY);