Overview
このガイドでは、 Java Reactive Streams ドライバーを使用して、コレクションに対してMongoDB Search クエリを実行する方法を学習します。 MongoDB Search を使用すると、 MongoDBコレクションに対して全文検索を実行できます。 MongoDB Search インデックスは、検索の動作とインデックスを作成するフィールド を指定します。
サンプル データ
moviessample_mflixこのガイドの例では、Atlasサンプルデータセットの データベースの コレクションを使用します。 MongoDBデプロイを作成し、サンプルデータセットをロードする方法については、 「 MongoDB の使用開始 」ガイドを参照してください。集計操作とビルダの詳細については、 集計フレームガイドを 参照してください 。
MongoDB 検索クエリを実行する
このセクションでは、コレクションに対してMongoDB 検索クエリを実行するための集計パイプラインを作成する方法について説明します。Aggregates.search() ビルダ メソッドを使用して、検索条件を指定する $searchパイプラインステージを作成できます。次に、aggregate() メソッドを呼び出し、パイプラインをパラメーターとして渡します。
注意
Atlas および Community Edition のバージョン要件
$search集計パイプライン演算子は、 MongoDB v. 以降を実行中MongoDB Atlasクラスター、またはMongoDB v.4 2以降を実行中MongoDB Community Edition 82クラスターでホストされているコレクションでのみ使用できます。コレクションはMongoDB Searchインデックスでカバーされている必要があります。必要な設定とこの演算子の機能の詳細については、 MongoDB Search のドキュメント を参照してください。
MongoDB Search クエリを実行する前に、コレクションに MongoDB Search インデックスを作成する必要があります。MongoDB Search インデックスをプログラムで作成する方法については、インデックスガイドの「MongoDB Search インデックスマネジメント」セクションを参照してください。
MongoDB 検索するの例
この例では、次のアクションを実行してMongoDB 検索クエリを実行します。
Aggregates.project()ビルダ メソッドを使用して$projectステージを構築し、クエリ結果にtitleフィールドを含めるようにドライバーに指示しますパイプラインのステージを
aggregate()メソッドに渡し、結果を出力します。
Publisher<Document> publisher = collection.aggregate( List.of( Aggregates.search(SearchOperator.text( SearchPath.fieldPath("title"), "Alabama")), Aggregates.project(Projections.include("title")) ) ); Flux.from(publisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
MongoDB 検索する メタデータ
Aggregates.searchMeta()メソッドを使用して $searchMetaパイプラインステージを作成します。これはMongoDB Search 結果のメタデータのみを返します。
注意
Atlas および Community Edition のバージョン要件
この集計パイプライン演算子は、v.. 以降を実行中MongoDB 4411Atlasクラスター、またはMongoDB v. 以降を実行中MongoDB Community Edition8 2クラスターでのみ使用できます。利用可能なバージョンの詳細なリストについては、 $searchMeta に関するMongoDB Atlas のドキュメント を参照してください。
次の例は、MongoDB Search 集計ステージのnearメタデータを示しています。これは、2010から1年以内にyearフィールド値を持つドキュメントの数を返します。
Aggregates.searchMeta( SearchOperator.near(2010, 1, fieldPath("year")));
このヘルパーメソッドの詳細については、 searchMeta() APIドキュメント を参照してください。
パイプライン検索ステージの作成
Java Reactive Streams ドライバーは、次の演算子のヘルパーメソッドを提供します。
演算子 | 説明 |
|---|---|
不完全な入力 string からの文字シーケンスを含む単語またはフレーズを検索します。 | |
2 つ以上の演算子を 1 つのクエリに結合します。 | |
フィールドが指定した値と一致するかどうかを確認します。 | |
指定されたインデックス付きフィールド名へのパスがドキュメント内に存在するかどうかをテストします。 | |
指定されたパスにあるBSON番号、日付、ブール値、ObjectId、uuid、または string 値の配列を検索し、フィールドの値が指定された配列内の任意の値と等しいドキュメントを返します。 | |
入力ドキュメントに類似するドキュメントを返します。 | |
数値、日付、 GeoJSONポイント値のクエリとスコアリングをサポートします。 | |
インデックス構成で指定されたアナライザを使用して、順序付けられたタームのシーケンスを含むドキュメントを検索します。 | |
インデックス付きフィールドと値の組み合わせのクエリをサポートします。 | |
数値、日付、string 値のクエリとスコアリングをサポートします。 | |
クエリフィールドを 正規式として解釈します。 | |
インデックス構成で指定したアナライザを使用して全文検索を実行します。 | |
検索stringに任意の文字と一致する特殊文字を使用するクエリを有効にします。 |
パイプライン検索ステージの例
この例を実行する前に、moviesコレクションに次の定義を持つMongoDB検索インデックスを作成する必要があります。
{ "mappings": { "dynamic": true, "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "normalizer": "lowercase", "type": "token" } } } }
MongoDB 検索インデックスの作成の詳細については、「インデックスガイド」の「MongoDB 検索インデックス マネジメント」セクションを参照してください。
次のコードでは、次の仕様を持つ $search ステージが作成されます。
genres配列に"Comedy"が含まれていることを確認fullplotフィールドでフレーズ"new york"を検索します1950から2000までのyear値と一致します"Love"というタームで始まるtitle値を検索します
List<Bson> pipeline = List.of( Aggregates.search( SearchOperator.compound() .filter( List.of( SearchOperator.in(fieldPath("genres"), List.of("Comedy")), SearchOperator.phrase(fieldPath("fullplot"), "new york"), SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000), SearchOperator.wildcard(fieldPath("title"), "Love *") ))), Aggregates.project( Projections.include("title", "year", "genres") )); Publisher<Document> publisher = collection.aggregate(pipeline); Flux.from(publisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
MongoDB 検索するヘルパーメソッドの詳細については、ドライバー Core API ドキュメントの SearchOperator インターフェース参照を参照してください。
詳細情報
MongoDB 検索する の詳細については、Atlas ドキュメントの MongoDB 検索する を参照してください。
API ドキュメント
このガイドで言及されているメソッドについて詳しくは、次のAPIドキュメントを参照してください。