読み取り操作
項目一覧
読み取り操作は、コレクションからドキュメントまたはドキュメントに関する情報を取得します。 フィルターを指定して、フィルター条件に一致するドキュメントのみを検索できます。
前提条件
このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。
のドキュメント 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 配置への接続
まず、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);