返すフィールドを指定する
項目一覧
Overview
このガイドでは、 Java Reactive Streams ドライバーを使用して、 読み取り操作から返されるフィールドを指定する方法を学習できます。 これらのフィールドは、 MongoDBがクエリから返すフィールドを指定するプロジェクションを使用して選択できドキュメント。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットの sample_restaurants.restaurants
コレクションを使用します。 無料のMongoDB Atlasクラスターを作成し、サンプルデータセットをロードする方法については、 の使用開始ガイドを参照してください。
重要
プロジェクトリ アクター ライブラリ
このガイドでは、プロジェクト Reactive ライブラリを使用して、Publisher
Java Reactive Streams ドライバー メソッドによって返された インスタンスを消費します。プロジェクト Reactor ライブラリとその使用方法の詳細については、React ドキュメントの「 使用開始 」 を参照してください。このガイドでは Project React ライブラリ メソッドをどのように使用しているかについて詳しくは、「 MongoDBへのデータの書込み 」ガイドを参照してください。
プロジェクションのタイプ
プロジェクションを使用して、検索されたドキュメントに含めるフィールドと除外するフィールドを指定できます。 デフォルトでは、特定のフィールドを含む は他のすべてのフィールドを除外するため、結果から_id
フィールドを除外しない限り、単一のプロジェクションに含むステートメントと除外するステートメントを組み合わせることはできません。
含めるフィールドの指定
次の構文を使用して、 読み取り操作の結果に含めるフィールドを指定します。
projection(fields(include("<field name>")))
プロジェクションを使用するには、クエリフィルターをfind()
メソッドに渡します。 次に、 projection()
メソッドをfind()
メソッド呼び出しに連鎖させます。
次の例では、 find()
メソッドを使用して、 name
フィールドの値が"Emerald Pub"
であるドキュメントを検索します。 次に、プロジェクションを使用して、返されたドキュメントのname
、 cuisine
、 borough
フィールドのみを含めます。
FindPublisher<Document> findProjectionPublisher = restaurants.find( eq("name", "Emerald Pub")) .projection(fields(include("name", "cuisine", "borough"))); Flux.from(findProjectionPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': ObjectId('...'), 'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub'} {'_id': ObjectId('...'), 'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub'}
プロジェクションを使用して返されるドキュメントに含めるフィールドを指定する場合、 _id
フィールドもデフォルトで含まれます。 他のすべてのフィールドは暗黙的に除外されます。 返されるドキュメントから省略するには、 _idフィールドを明示的に除外する必要があります。
_id フィールドの除外
excludeId()
メソッドを使用して、返されるドキュメントから_id
フィールドを除外できます。
次の例では、前の例と同じクエリを実行しますが、返されたドキュメントの_id
フィールドも除外されています。
FindPublisher<Document> findProjectionPublisher = restaurants.find( eq("name", "Emerald Pub")) .projection(fields(include("name", "cuisine", "borough"), excludeId())); Flux.from(findProjectionPublisher) .doOnNext(System.out::println) .blockLast();
{'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub'} {'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub'}
除外するフィールドの指定
次の構文を使用して、 読み取り操作の結果から除外するフィールドを指定します。
projection(fields(exclude("<field name>")))
プロジェクションを使用するには、クエリフィルターをfind()
メソッドに渡します。 次に、 projection()
メソッドをfind()
メソッド呼び出しに連鎖させます。
次の例では、 find()
メソッドを使用して、 name
フィールドの値が"Emerald Pub"
であるすべてのレストランを検索します。 次に、プロジェクションを使用して、返されるドキュメントからgrades
address
フィールドと フィールドを除外します。
FindPublisher<Document> findProjectionPublisher = restaurants.find( eq("name", "Emerald Pub")) .projection(fields(exclude("grades", "address"))); Flux.from(findProjectionPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': ObjectId('...'), 'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub', 'restaurant_id': '40367329'} {'_id': ObjectId('...'), 'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub', 'restaurant_id': '40668598'}
プロジェクションを使用して除外するフィールドを指定すると、指定されていないフィールドは返されるドキュメントに暗黙的に含まれます。
プロジェクションのエラー
次のセクションでは、プロジェクションの使用中に発生する可能性のあるエラーについて説明します。
包含と除外エラー
単一のプロジェクションにフィールドを含め、除外しようとすると、ドライバーは次の結果を返します。
OperationFailure: ... Cannot Do Exclusion on Field <field> in Inclusion Projection
このエラーを解決するには、プロジェクションが、含めるフィールドのみ、または除外するフィールドのみを指定することを確認します。
詳細情報
プロジェクションの詳細については、MongoDB Server マニュアルの「プロジェクト フィールド 」ガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。