Docs Menu
Docs Home
/ / /
Java Reactive Streams ドライバー
/

読み取り操作

項目一覧

  • 前提条件
  • MongoDB 配置への接続
  • コレクションのクエリ
  • クエリフィルター
  • 空のフィルター
  • フィルター ヘルパー
  • FindPublisher
  • プロジェクション
  • ソート
  • プロジェクションによるソート
  • explain
  • 読み込み設定 (read preference)
  • 読み取り保証(read concern)

読み取り操作は、コレクションからドキュメントまたはドキュメントに関する情報を取得します。 フィルターを指定して、フィルター条件に一致するドキュメントのみを検索できます。

このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。

  • のドキュメント 3}Github test.restaurantsドキュメントの ファイルのドキュメントが入力されたrestaurants.json {0 コレクション。

  • 次のインポート ステートメントは次のとおりです。

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 配置に接続し、 インスタンスとMongoDatabase MongoCollectionインスタンスを 宣言して定義します。

次のコードは、ポート27017localhostで実行されているスタンドアロンの 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 ドキュメント を参照してください。

find()メソッドはFindPublisherインターフェースのインスタンスを返します。 インターフェースは、 find()メソッドに連結して、 sort()projection()などのクエリの出力や動作を変更したり、 subscribe()メソッドを介して結果を反復処理したりするためのさまざまなメソッドを提供します。

デフォルトでは、MongoDB のクエリは一致するドキュメント内のすべてのフィールドを返します。 一致するドキュメントで返されるフィールドを指定するには、 プロジェクション ドキュメントを指定できます。

この検索操作の例には、一致するドキュメントにnamestars 、および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());

検索操作を説明するには、 FindPublisher.explain()メソッドを呼び出します。

collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery")))
.explain()
.subscribe(new PrintDocumentSubscriber());

レプリカセットまたはシャーディングされたクラスターに対する読み取り操作の場合、次のレベルで読み込み設定(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");
  • MongoDatabasewithReadPreference()メソッドを使用することで、

    MongoDatabase database = mongoClient.getDatabase("test")
    .withReadPreference(ReadPreference.secondary());
  • MongoCollectionwithReadPreference()メソッドを使用することで、

    MongoCollection<Document> collection = database.getCollection("restaurants")
    .withReadPreference(ReadPreference.secondary());

MongoDatabaseMongoCollectionインスタンスは不変です。 既存のMongoDatabaseまたはMongoCollectionインスタンスでwithReadPreference()を呼び出すと、新しい インスタンスが返されますが、メソッドが呼び出されるインスタンスには影響しません。

次の例では、 collectionWithReadPrefインスタンスの読み込み設定(read preference)はprimaryPreferredですが、 collectionの読み込み設定(read preference)は影響を受けません。

MongoCollection<Document> collectionWithReadPref = collection.withReadPreference(ReadPreference.primaryPreferred());

レプリカセットまたはシャーディングされたクラスターに対する読み取り操作の場合、アプリケーションは次のレベルで読み取り保証を構成できます。

  • 次の方法で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");
  • MongoDatabasewithReadConcern()メソッドを使用することで、

    MongoDatabase database = mongoClient.getDatabase("test")
    .withReadConcern(ReadConcern.MAJORITY);
  • MongoCollectionwithReadConcern()メソッドを使用することで、

    MongoCollection<Document> collection = database.getCollection("restaurants")
    .withReadConcern(ReadConcern.MAJORITY);

MongoDatabaseMongoCollectionインスタンスは不変です。 既存のMongoDatabaseまたはMongoCollectionインスタンスでwithReadConcern()を呼び出すと、新しい インスタンスが返されますが、メソッドが呼び出されるインスタンスには影響しません。

次の例では、 collWithReadConcernインスタンスにはAVAILABLEの読み取り保証がありますが、 collectionの読み取り保証には影響がありません。

MongoCollection<Document> collWithReadConcern = collection.withReadConcern(ReadConcern.AVAILABLE);

MongoClientSettingsMongoDatabase 、またはMongoCollectionインスタンスをビルドすると、読み取り保証、読み込み設定(read preference)、書込み保証(write concern)の組み合わせを含めることができます。

たとえば、次のコードでは、コレクション レベルで 3 つすべてを設定します。

collection = database.getCollection("restaurants")
.withReadPreference(ReadPreference.primary())
.withReadConcern(ReadConcern.MAJORITY)
.withWriteConcern(WriteConcern.MAJORITY);

戻る

インデックスの作成