Overview
このガイドでは、 Searchビルダーを使用して MongoDB .NET/C# ドライバーで$search集計パイプライン ステージを構築する方法を学びます。
$searchパイプライン ステージの詳細については、 $search を参照してください。
注意
Atlas および Community Edition のバージョン要件
$search集計パイプライン演算子は、 MongoDB v. 以降を実行中MongoDB Atlasクラスター、またはMongoDB v.4 2以降を実行中MongoDB Community Edition 82クラスターでホストされているコレクションでのみ使用できます。コレクションはMongoDB Searchインデックスでカバーされている必要があります。必要な設定とこの演算子の機能の詳細については、 MongoDB Search のドキュメント を参照してください。
サンプル データ
このガイドの例では、 sample_mflixデータベースの moviesコレクションを使用します。このコレクションのドキュメントには、タイトル、プロット、ジャンル、評価など、映画に関する情報が含まれています。次の Movieクラスは、このコレクション内のドキュメントをモデル化します。
[] public class Movie { [] public ObjectId Id { get; set; } public string Title { get; set; } = null!; public string Plot { get; set; } = null!; public string[] Genres { get; set; } = null!; public int Year { get; set; } public string Rated { get; set; } = null!; public Imdb Imdb { get; set; } = null!; [] public float[] PlotEmbedding { get; set; } = null!; public double Score { get; set; } [] [] public SearchScoreDetails ScoreDetails { get; set; } = null!; [] public string PaginationToken { get; set; } = null!; }
Movieクラスは次の Imdbクラスを参照します。このクラスは、各ドキュメント内のネストされた imdbフィールドをモデル化します。
[] public class Imdb { public double Rating { get; set; } public int Votes { get; set; } public int Id { get; set; } }
注意
サンプル データ内のキャメルケースのフィールド名
movies コレクションのドキュメントは、キャメル ケースの命名規則を使用します。このガイドの例では、ConventionPack を使用してコレクション内のフィールドをパスカル ケースに逆シリアル化し、Movie クラスのプロパティにマップします。
カスタム直列化について詳しくは、「カスタム直列化」を参照してください。
Some examples in this guide use additional collections and model classes, which the relevant sections introduce. All collections are from the sample datasets provided by Atlas. See Get Started with the .NET/C# Driver to learn how to create a free MongoDB cluster and load this sample data.
注意
サンプル データで一貫性のないフィールド型
moviesコレクション内の一部のドキュメントでは、imdb.rating フィールドと imdb.votes フィールドが数値ではなく文字列として保存されています。モデルクラスでこれらのフィールドを double または int として定義すると、ドライバーはそれらのドキュメントを逆直列化するときに FormatException をスローします。
混合フィールド型のドキュメントを処理するには、複数のBSON型を受け入れるカスタム シリアライザーを実装し、影響を受けるプロパティに [BsonSerializer] 属性を使用して適用します。
[] public class Imdb { [] public double Rating { get; set; } [] public int Votes { get; set; } public int Id { get; set; } }
FlexibleDoubleSerializer などのカスタム シリアライザーを実装する方法については、カスタム シリアライザー を参照してください。
MongoDB Search インデックスの作成
Atlasコレクションで検索を実行する前に、まずコレクションに検索インデックスを作成する必要があります。MongoDB 検索インデックスは、検索可能な形式でデータを分類するデータ構造です。
MongoDB 検索インデックスの作成方法については、MongoDB 検索インデックスの作成ガイドを参照してください。
MongoDB 検索する 演算子とコレクター
Searchクラスには、$search 操作を実行するために使用できるメソッドが含まれています。使用可能な $search 演算子とコレクターの完全なリストについては、Atlas の演算子とコレクターに関するガイドを参照してください。
オートコンプリート
Autocomplete()メソッドを使用して、不完全な入力 string からの文字シーケンスを含む単語またはフレーズを検索します。
次の例では、string "Gravity" で始まるテキストの titleフィールドに対してオートコンプリート クエリを実行します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Autocomplete(m => m.Title, "Gravity"), indexName: "movietitles") .ToList();
autocomplete演算子の詳細については、Atlas のオートコンプリートガイドを参照してください。
注意
オートコンプリート クエリ用インデックス
オートコンプリート クエリを正常に実行するには、オートコンプリートをサポートするMongoDB 検索インデックスを作成する必要があります。詳細を学ぶには、Atlas ドキュメントのオートコンプリート用にフィールドをインデックスする方法を参照してください。
MongoDB Searchインデックスを作成したら、前述の例に示すように、インデックス名を Autocomplete() メソッドに渡す必要があります。
複合
2 つ以上の演算子を 1 つの検索に結合するには、 Compound()メソッドを使用します。
次の例では、movies コレクション内で次のすべての条件に一致するドキュメントを検索します。
imdb.ratingフィールドはドキュメントに存在するratedフィールド値は"G"ではありませんyearフィールドの値が 2000 より大きい
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Compound() .Must(Builders<Movie>.Search.Exists(m => m.Imdb.Rating)) .MustNot(Builders<Movie>.Search.Equals(m => m.Rated, "G")) .Must(Builders<Movie>.Search.Range(m => m.Year, SearchRangeBuilder.Gt(2000)))) .ToList();
compound演算子の詳細については、 Atlas複合ガイド をご覧ください。
embeddedDocument
EmbeddedDocument()メソッドを使用して、フィールドの配列値内のドキュメントに対して検索操作を実行します。
注意
必須の埋め込みドキュメントインデックス
埋め込みドキュメントを検索するには、配列フィールドにembeddedDocumentインデックスを作成する必要があります。
embeddedDocumentインデックスを定義する方法については、Atlas ドキュメントの「 embeddedDocument 型のインデックスの定義」を参照してください。
この節の例は、sample_restaurantsデータベースのrestaurantsコレクションを使用しています。次のクラスは、そのコレクション内のドキュメントをモデル化します。
[] public class Restaurant { [] public ObjectId Id { get; set; } public string Name { get; set; } = null!; public string Cuisine { get; set; } = null!; public string Borough { get; set; } = null!; public List<GradeEntry> Grades { get; set; } = null!; }
[] public class GradeEntry { public string Grade { get; set; } = null!; public int? Score { get; set; } }
次の例では、そのコレクションで、grades 配列に grade フィールドの値が "A" であるエントリが含まれているレストランを検索します。
var result = restaurantsCollection.Aggregate() .Search(Builders<Restaurant>.Search.EmbeddedDocument( r => r.Grades, Builders<GradeEntry>.Search.Equals(g => g.Grade, "A") ), indexName: "restaurantsembedded").ToList();
embeddedDocument演算子の詳細については、 embeddedDocument Atlas のガイドを参照してください。
以下のセクションでは、埋め込みドキュメント検索を拡張するために使用できる追加のパラメータと演算子について説明します。
returnScope パラメーター
returnScope パラメーターを Search() または SearchMeta() メソッドで使用して、配列フィールドから埋め込みドキュメントをルートレベルのドキュメントの代わりに個別の結果として返します。returnScope を指定すると、MongoDB Search は各埋め込みドキュメントを独立してスコアし、ソートし、カウントします。
このパラメーターは、埋め込みドキュメントを含む配列フィールドへのパスを指定する Lambda 式を受け付けます。
returnScope を使用するには、次の手順を実行する必要があります。
配列フィールドのインデックスでは、
embeddedDocuments型としてインデックス化します。取得したい入れ子フィールドに対して、インデックス定義でstoredSource オプションを設定します。
検索オプションで
ReturnStoredSourceをtrueに設定してください。
次の例では、restaurants コレクションから、grades 配列の中に "A" の値を持つドキュメントを取得します。コードは r => r.Grades 式を Search() メソッドに returnScope パラメーターとして渡し、ドライバーに grades 配列内の埋め込みドキュメントを個別の結果として返すよう指示します。
var result = restaurantsCollection.Aggregate() .Search( Builders<Restaurant>.Search.Equals("grades.grade", "A"), r => r.Grades, new SearchOptions<Restaurant> { ReturnStoredSource = true, IndexName = "restaurantsembedded" }) .ToList();
詳細については、Atlas ドキュメントの fts-return-scope を参照してください。
HasAncestor
HasAncestor() メソッドを EmbeddedDocument() クエリ内で使用して、入れ子の中間祖先レベルにあるフィールドでフィルターをかけます。祖先フィールドは、returnScope パラメーターで指定した埋め込みフィールドの親である embeddedDocuments 型のフィールドですが、ルート ドキュメントではありません。
次のパラメータをHasAncestor()メソッドに渡します。
Parameter | 必須 | 説明 |
|---|---|---|
| はい | 祖先フィールドへのパス |
| はい | 祖先フィールド内のフィールドに適用する検索演算子 |
| No | 検索結果に適用するスコア修飾子 |
学ぶためには、Atlas ドキュメントの has-ancestor-ref を参照してください。
HasRoot
埋め込みドキュメント検索を実行する際に、ルートレベルのフィールドでフィルタリングするには、HasRoot() メソッドを EmbeddedDocument() クエリ内で使用します。
次のパラメータをHasRoot()メソッドに渡します。
Parameter | 必須 | 説明 |
|---|---|---|
| はい | ルートレベルのフィールドに適用する検索演算子。 |
| No | 検索結果に適用するスコア修飾子。 |
次の例では、restaurants コレクションから、grades 配列内に少なくとも 1 つの"A" 値を持つドキュメントを検索します。クエリは、HasRoot() メソッドを使用して、ルートレベルの borough フィールドで "Manhattan" の値を絞り込みます。
var result = restaurantsCollection.Aggregate() .Search( Builders<Restaurant>.Search.EmbeddedDocument<Restaurant>( "grades", Builders<Restaurant>.Search.Compound() .Must( Builders<Restaurant>.Search.HasRoot( Builders<Restaurant>.Search.Equals(r => r.Borough, "Manhattan")), Builders<Restaurant>.Search.Equals("grade", "A"))), new SearchOptions<Restaurant> { IndexName = "restaurantsembedded" }) .ToList();
詳細については、Atlas ドキュメントの has-root-ref を参照してください。
equals
フィールドが指定された値と一致するかどうかを確認するには、 Equals()メソッドを使用します。
次の例では、 moviesコレクションで、yearフィールドの値が 2000 であるドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Equals(m => m.Year, 2000)) .ToList();
equals演算子の詳細については、 Atlas ガイドと等価を参照してください。
exists
指定されたインデックス付きフィールド名が存在するドキュメントを検索するには、Exists() メソッドを使用します。指定されたフィールドが存在してもインデックスが作成されていない場合、ドキュメントは結果セットに含まれません。
次の例では、moviesコレクションで imdb.ratingフィールドが存在するドキュメントを検索します。検索では、imdb.ratingフィールドが存在するすべてのドキュメントが返されます。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Exists(m => m.Imdb.Rating)) .ToList();
exists演算子の詳細については、既存のAtlasガイドを参照してください。
Facet
Facet() メソッドを使用して、指定されたファセットフィールドの値または範囲で結果をグループ化し、各グループのカウントを返します。
Facet() メソッドは、$search ステージと $searchMeta ステージの両方で使用できます。MongoDB、クエリのみのメタデータ結果を検索するために、 $searchMeta ステージでファセットを使用することを推奨しています。$search ステージを使用してメタデータ結果とクエリ結果を検索するには、$$SEARCH_META集計変数を使用する必要があります。この変数の詳細については、SEARCH_META 集計変数 Atlasガイド を参照してください。
次の制限が適用されます。
ファセット クエリは単一のフィールドに対してのみ実行できます。フィールドのグループに対してファセット クエリを実行することはできません。
MongoDB v6.0 を実行しているクラスター上のシャーディングされたコレクションに対してのみファセット クエリを実行できます。
次の例では、moviesコレクションで、yearフィールドの値が 2000 以上のドキュメントを検索します。クエリは Facet() メソッドを使用して入力ドキュメントを処理します。genresフィールドに基づいて結果に返す最大数の 100ファセットカテゴリが含まれます。クエリは、見つかった個別のジャンルの数を返します。
var result = moviesCollection.Aggregate() .SearchMeta( Builders<Movie>.Search.Facet( Builders<Movie>.Search.Range(m => m.Year, SearchRangeBuilder.Gte(2000)), Builders<Movie>.SearchFacet.String("genres", m => m.Genres, 100)), indexName: "moviesfacetsearch") .Single() .Facet["genres"].Buckets.Count();
facetコレクターの詳細については、「ファセットAtlas ガイド」を参照してください。
geoShape
GeoShape()メソッドを使用して、特定のジオメトリに関連するドキュメントを検索します。 検索する座標を指定する場合は、最初に 経度 、次に 緯度 を指定する必要があります。 経度の値は、両端を含む-180から180までです。 緯度の値は、両端を含む-90から90までです。
注意
MongoDB Search は以下の機能をサポートしていません。
非デフォルトの座標参照システム(CRS)
平面 XY 座標系 (2 次元)
座標ペアのポイント表記(pointFieldName: [12, 34])
この例では、sample_mflixデータベースの theatersコレクションを使用します。次の クラスは、そのコレクション内のドキュメントをモデル化します。
[] public class Theater { [] public ObjectId Id { get; set; } public int TheaterId { get; set; } public TheaterLocation Location { get; set; } = null!; }
[] public class TheaterLocation { [] public GeoJsonPoint<GeoJson2DGeographicCoordinates> Geo { get; set; } = null!; }
次の例では、そのコレクションで、location.geoフィールドの座標が最小値 MN 領域内の指定された多角形と交差されているすべてのドキュメントを検索します。
GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[] { new(-93.5, 44.7), new(-93.5, 45.0), new(-93.0, 45.0), new(-93.0, 44.7), new(-93.5, 44.7), }))); var result = theatersCollection.Aggregate() .Search(Builders<Theater>.Search.GeoShape( t => t.Location.Geo, GeoShapeRelation.Intersects, searchArea), indexName: "theatersgeo") .ToList();
geoShape演算子の詳細については、 geoShape Atlas ガイドを参照してください。
geoWithin
GeoWithin()メソッドを使用して、指定されたGeoJSONフィールドの座標が特定のジオメトリ内にあるドキュメントを検索します。 内にあるポイントを検索できます。
円
境界ボックス
多角形
検索する座標を指定する場合は、最初に 経度 、次に 緯度 を指定する必要があります。 経度の値は、両端を含む-180から180までです。 緯度の値は、両端を含む-90から90までです。
注意
MongoDB Search は以下の機能をサポートしていません。
非デフォルトの座標参照システム(CRS)
平面 XY 座標系 (2 次元)
座標ペアのポイント表記(pointFieldName: [12, 34])
次の例では、 theatersコレクションで、location.geoフィールドの座標が指定された多角形内にあるすべてのドキュメントを検索します。
GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[] { new(-94.0, 44.5), new(-94.0, 45.2), new(-92.5, 45.2), new(-92.5, 44.5), new(-94.0, 44.5), }))); var result = theatersCollection.Aggregate() .Search(Builders<Theater>.Search.GeoWithin(t => t.Location.Geo, searchArea), indexName: "theatersgeo") .ToList();
geoWithin演算子の詳細については、 geoWithin Atlas ガイド を参照してください。
で
指定値のリストと一致するフィールド値を持つドキュメントを検索するには、In() メソッドを使用します。
次の例では、 moviesコレクションで、"Action" または "Comedy" のいずれかを含む genres 配列を持つドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.In(m => m.Genres, new[] { "Action", "Comedy" })) .ToList();
moreLikeThis
入力ドキュメントに類似するドキュメントを検索するには、 MoreLikeThis()メソッドを使用します。
この例では、次のクラスを使用して、検索の入力ドキュメントを指定します。
public class MovieSearch { public string Plot { get; set; } = null!; }
次の例では、 moviesコレクションで、plotフィールドの値が "time travel" であるオブジェクトに類似するドキュメントを検索します。
var searchDocument = new MovieSearch() { Plot = "time travel", }; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.MoreLikeThis(searchDocument)) .ToList();
moreLikeThis演算子の詳細については、Atlas ガイドのmoreLikeThis Atlas ガイドを参照してください。
near
Near()メソッドを使用して、指定したフィールドが指定の値に近いドキュメントを検索します。 検索は、次に対して実行できます。
数値フィールド
日付フィールド
地理的ポイント
次の例では、 moviesコレクションで、imdb.ratingフィールドの値が 8.5 に近いドキュメントを検索します。値が 8.5 に近いかどうかに基づいて、ドキュメントは順番に返されます。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Near(m => m.Imdb.Rating, 8.5, 1)) .ToList();
near演算子の詳細については、近くのAtlas ガイドを参照してください。
phrase
指定したフィールドに入力stringが含まれているドキュメントを検索するには、Phrase() メソッドを使用します。
次の例では、 moviesコレクションで、plotフィールドにフレーズ "time travel" が含まれているドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Phrase(m => m.Plot, "time travel")) .ToList();
また、コレクション内で plotフィールドで "time travel" または "space adventure" のいずれかを含むドキュメントを検索することもできます。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Phrase(m => m.Plot, new List<string>() { "time travel", "space adventure" })) .ToList();
phrase演算子について詳しくは、Atlas ガイドのフレーズを参照してください。
queryString
QueryString()メソッドを使用して、次の演算子と区切り文字を含む string を使用してドキュメントを検索します。
ANDORNOT()
次の例では、 moviesコレクションで、 plotフィールドの値が次の各条件に一致するドキュメントを検索します。
string
"time"または string"space"が含まれますstring を含みません
"comedy"
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.QueryString(m => m.Plot, "(time OR space) AND NOT comedy")) .ToList();
queryString演算子の詳細については、 Atlas ガイドのqueryStringを参照してください。
Range(範囲)
Range() メソッドを使用して、指定フィールドの値が特定の数値、日付、または文字列の範囲内にあるドキュメントを検索します。
次の例では、 moviesコレクションで、year の値が 2000 より大きく 2010 より小さいすべてのドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search .Range(m => m.Year, SearchRangeBuilder.Gt(2000).Lt(2010))) .ToList();
To search for documents in which the value of a specified field is within a range of strings, you must first create a token index on the field. After you create the index, you can search for documents based on a range of strings. The following example returns documents in which the title field value falls between "A" and "G", compared in lexicographic order:
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search .Range(m => m.Title, SearchRangeV2Builder.Gte("A").Lte("G"))) .ToList();
range演算子の詳細については、 Atlas の範囲ガイド を参照してください。
regex
正規表現を使用してドキュメントを検索するには、 Regex()メソッドを使用します。
次の例では、 moviesコレクションで、titleフィールドの値に 6 文字だけが含まれているドキュメントを検索します。
var regex = "[A-Za-z]{6}"; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Regex(m => m.Title, regex, allowAnalyzedField: true)) .ToList();
注意
分析されたフィールドでの正規表現の実行
デフォルトでは 、regex 演算子は 分析対象フィールドでは実行できません。次のように、allowAnalyzedField オプションを true に設定することで、分析するフィールドで実行することができます。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Regex(m => m.Title, regex, allowAnalyzedField: true)) .ToList();
Setting the allowAnalyzedField option to true may lead to unexpected search results. To learn more, see Behavior in the Atlas regex guide.
regex演算子の詳細については、 Atlas ガイドの正規表現を参照してください。
span
フィールドのリージョン内に一致するテキスト検索を検索するには、 Span()メソッドを使用します。 このメソッドを使用すると、指定した精度で相互に近い文字列を検索できます。
注意
Span 演算子のパフォーマンス
span演算子は、クエリが位置情報を追跡する必要があるため、他の演算子よりも計算負荷が高くなります。
次の例では、moviesコレクションで、plotフィールドの値に"time"と"travel"が互いに1単語以内に含まれるドキュメントを検索します。
var searchTerms = new[] { Builders<Movie>.SearchSpan.Term(m => m.Plot, "time"), Builders<Movie>.SearchSpan.Term(m => m.Plot, "travel") }; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Span(Builders<Movie>.SearchSpan.Near(searchTerms, 1))) .ToList();
span演算子の詳細については、 Atlas ガイドの範囲を参照してください。
Text
ドキュメント内で指定された string または string の配列を検索するには、Text() メソッドを使用します。特定の string に複数の検索期間がある場合、 MongoDB Search は 文字列内の各期間の一致も個別に検索します
次の例では、 moviesコレクションで、plotフィールドの値に string "secret agent" が含まれるドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text(m => m.Plot, "secret agent")) .ToList();
Tip
マルチターム検索の動作
検索 string に複数のタームが含まれている場合、このメソッドは string 内の各タームの一致も個別に検索します
text演算子の詳細については、Atlas ガイドのテキストを参照してください。
ワイルドカード
Wildcard() メソッドを使用して、検索stringに任意の文字に一致する特殊文字を使用してドキュメントを検索します。 検索では、次の文字を使用できます。
文字 | 説明 |
|---|---|
| 任意の 1 文字と一致 |
| 0 文字以上の文字と一致 |
| エスケープ文字 |
次の例では、 titleフィールドの値に string "Amer" とそれに続く他の文字が含まれているドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Wildcard(m => m.Title, "Amer*", allowAnalyzedField: true)) .ToList();
注意
分析対象フィールドでのワイルドカードの実行
デフォルトでは 、wildcard 演算子は 分析対象フィールドでは実行できません。次のように、allowAnalyzedField オプションを true に設定することで、分析フィールドで実行できるようになります。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Wildcard(m => m.Title, "Amer*", allowAnalyzedField: true)) .ToList();
allowAnalyzedFieldオプションを true に設定すると、予期しない検索結果が発生する可能性があります。 詳しくは、「ワイルドカードの動作 」を参照してください。
wildcard演算子の詳細については、ワイルドカードAtlas のガイドを参照してください。
検索パスの指定
検索するフィールドへのパスは、SearchPathDefinitionBuilderクラスを使用して指定できます。Builders<TDocument>.SearchPath を使用して SearchPathDefinitionBuilderインスタンスにアクセスし、そのメソッドの 1 つを呼び出して検索パスを指定します。次のセクションでは、利用可能なメソッドについて説明します。
シングル フィールド
検索パスとして 1 つのフィールドを指定するには、Single() メソッドを使用します。次の例は、フィールドを指定する 3 つの方法です。型指定されたモデルでラムダ式を使用する、実行時に値が既知であるfieldName変数やメソッド パラメータなどの文字列フィールド名を渡します、または型指定されていないドキュメントを使用します。
注意
Single()メソッドに渡すフィールドは、検索インデックス定義に含める必要があります。フィールドが含まれていない場合、 MongoDB Server はエラーを返さずに空の結果セットを返します。
Lambda式
型付きモデルを操作していて、コンパイル時にフィールド名がわかっている場合は、 lambda 式を使用します。この形式では、コンパイル時に型をチェックできます。
次の例では、 plotフィールドでテキスト "secret agent" を含むドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Single(m => m.Plot), "secret agent")) .ToList();
string フィールド名
型付きモデルを操作しているが、コンパイル時にフィールド名が不明な場合は、FieldDefinition<TDocument> を使用します。ユーザー入力または構成ファイルからフィールド名を検索する場合は、この形式の使用を検討してください。
次の例ではフィールド名を FieldDefinition<Movie> 変数に割り当て、それを Single() に渡します。
FieldDefinition<Movie> runtimeField = fieldName; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Single(runtimeField), "secret agent")) .ToList();
BsonDocument
型指定されたモデルではなく BsonDocument オブジェクトを操作する場合は、フィールド名を string として指定する必要があります。
次の例では、型なしのコレクションで、テキスト "secret agent" を含むドキュメントを plotフィールドで検索します。
var result = moviesCollectionBson.Aggregate() .Search(Builders<BsonDocument>.Search.Text( Builders<BsonDocument>.SearchPath.Single("plot"), "secret agent")) .ToList();
複数のフィールド
複数のフィールドの検索パスを指定するには、Multi() メソッドを使用します。結果セットには、指定されたフィールドのいずれかに一致するドキュメントが含まれます。
注意
Multi()検索インデックス定義には、 メソッドに渡すすべてのフィールドを含める必要があります。含まれていないフィールドを渡すと、 MongoDB Server は暗黙的にそのフィールドを検索から除外します。
次の例では、plot または titleフィールドのいずれかでフレーズ "time travel" を検索します。
var result = moviesCollection.Aggregate().Search( Builders<Movie>.Search.Phrase(Builders<Movie>.SearchPath .Multi(m => m.Plot, m => m.Title), "time travel"), indexName: "moviesmulti") .ToList();
analyzer
アナライザは、小文字化などの操作を適用して、テキストを検索可能なトークンに処理します。 MongoDB Server は、フィールドのインデックスを作成するときにアナライザを適用し、そのフィールドに対してクエリを実行中ときに再度アナライザを適用します。検索インデックスを作成するときに マルチ オプションを指定すると、 MongoDB Server は代替アナライザによって生成された 2 つ目のトークン セットも保存します。
Analyzer() メソッドを使用すると、フィールドのデフォルトのアナライザによって生成されたトークンではなく、multiアナライザによって生成されたトークンに対してクエリを実行できます。Analyzer() に渡す名前は、基礎のアナライザの名前ではなく、インデックス定義内の multi ブロックのキー名である必要があります。
次の例では、"lucene" という名前の multiアナライザを使用して、titleフィールドでテキスト "gravity" を含むドキュメントを検索しています。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Analyzer(m => m.Title, "lucene"), "gravity"), indexName: "moviesanalyzer") .ToList();
ワイルドカード パス
フィールド名を一致させるためにワイルドカード文字を使用する検索パスを指定するには、Wildcard() メソッドを使用します。フィールド名の * 文字を使用して、任意の文字シーケンスを一致させることができます。
MongoDB Server は、次の条件を満たすフィールドのみを検索します。
フィールドはインデックスを付ける必要があります。
フィールド名は指定されたパターンと一致する必要があります。
フィールドのデータ型は検索演算子と一致する必要があります。例、
Text()クエリは string フィールドのみを検索します。
次の例では、名前が "p" で始まるすべてのフィールドで、"secret agent" というテキストを含むドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Wildcard("p*"), "secret agent")) .ToList();
注意
ワイルドカード パフォーマンス
"*" などの幅広いパターンはすべてのインデックス付きフィールドに一致するため、大規模なインデックスではクエリ パフォーマンスに影響を与える可能性があります。
スコアのドキュメント
MongoDB Server は、 MongoDB Search クエリから返されるすべてのドキュメントに関連性スコアを割り当てます。クエリは、最高スコアから最低スコアの順にドキュメントを返します。スコアが割り当てられる方法の詳細については、「 スコア Atlasガイド 」を参照してください。
返されたドキュメントに割り当てられるスコアは、ドキュメントのメタデータの一部です。集計パイプラインで $project ステージを使用すると、返された各ドキュメントのスコアを結果セットに含めることができます。
次の例では、 moviesコレクションで、titleフィールドの値に 6 文字だけが含まれているドキュメントを検索し、$project ステージを使用して返されるドキュメントに score という名前のフィールドを追加します。
var regex = "[A-Za-z]{6}"; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Regex(m => m.Title, regex, allowAnalyzedField: true), indexName: "moviescore") .Project<Movie>(Builders<Movie>.Projection .Include(m => m.Id) .Include(m => m.Title) .Include(m => m.Plot) .MetaSearchScore(m => m.Score)) .ToList();
MongoDB 検索するの動作を変更する
SearchOptionsオブジェクトをパラメーターとして渡すことで、Search() メソッドの動作を変更できます。
SearchOptionsクラスには、次のプロパティが含まれています。
プロパティ | 説明 |
|---|---|
| 検索結果をカウントするオプション。 データ型: SearchCountOptions |
| 元のコンテキストで検索期間を表示するためのオプション。 データ型: SearchHighlightOptions%デフォルト:<TDocument> |
| 検索に使用するインデックス。 Data type: |
| データベースでドキュメント全体を検索するか、MongoDB Search から直接保存されたソース フィールドのみを返すかを指定するフラグです。 Data type: |
| 結果内の各ドキュメントのスコアに関する詳細情報を返すかどうかを指定するフラグ。 Data type: |
| ページ分けの開始点。設定すると、検索は指定された参照点の直後からドキュメントを検索します。 Data type: |
| ページ分けの終点。設定すると、指定された参照点の直前からドキュメントの検索が開始されます。 Data type: |
| 結果に適用するソート条件。 Data type: SortDefinition<TDocument> |
| 検索期間を追跡するためのオプション。 データ型: SearchTrackingOptions |
SearchAfter の例
次の例では、次のアクションを実行してMongoDB検索する操作の結果をページ分割します。
MetaSearchSequenceToken()ビルダ メソッドを使用するプロジェクションを定義します。このメソッドでは、基準点を含むPaginationTokenを指定しますSearchOptionsインデックスとソート条件を設定する SearchOptions インスタンスを作成します。初期検索を実行して、
plotフィールド値に"time travel"というテキストを含むドキュメントを見つけ、プロジェクションとオプションを操作に適用します。同じ
SearchOptionsインスタンスのSearchAfterプロパティを設定し、基本検索の最初の結果の後に次の検索を開始するように指示します。同じ一致条件を持つ別の検索操作を実行し、検索オプションを適用して結果をページネーションします
var projection = Builders<Movie>.Projection .Include(x => x.Title) .MetaSearchSequenceToken(x => x.PaginationToken); var searchDefinition = Builders<Movie>.Search.Text(m => m.Plot, "time travel"); var searchOptions = new SearchOptions<Movie> { IndexName = "default", Sort = Builders<Movie>.Sort.Ascending(m => m.Id) }; // Runs the base search operation var baseSearchResults = moviesCollection.Aggregate() .Search(searchDefinition, searchOptions) .Project<Movie>(projection) .ToList(); if (baseSearchResults.Count == 0) return baseSearchResults; // Sets the starting point for the next search searchOptions.SearchAfter = baseSearchResults[0].PaginationToken; var result = moviesCollection.Aggregate() .Search(searchDefinition, searchOptions) .Project<Movie>(projection) .ToList();