AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

MongoDB Search

このガイドでは、 Searchビルダーを使用して MongoDB .NET/C# ドライバーで$search集計パイプライン ステージを構築する方法を学びます。

$searchパイプライン ステージの詳細については、 $search を参照してください。

注意

Atlas および Community Edition のバージョン要件

The $search aggregation-pipeline operator is available only for collections hosted on MongoDB Atlas clusters running MongoDB v4.2 or later, or on MongoDB Community Edition clusters running MongoDB v8.2 or later. Collections must be covered by a MongoDB Search index. To learn more about the required setup and the functionality of this operator, see the MongoDB Search documentation.

このガイドの例では、 sample_mflixデータベースの moviesコレクションを使用します。このコレクションのドキュメントには、タイトル、プロット、ジャンル、評価など、映画に関する情報が含まれています。次の Movieクラスは、このコレクション内のドキュメントをモデル化します。

[BsonIgnoreExtraElements]
public class Movie
{
[BsonId]
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!;
[BsonElement("plot_embedding")]
public float[] PlotEmbedding { get; set; } = null!;
public double Score { get; set; }
[BsonElement("scoreDetails")]
[BsonIgnoreIfNull]
public SearchScoreDetails ScoreDetails { get; set; } = null!;
[BsonElement("paginationToken")]
public string PaginationToken { get; set; } = null!;
}

Movieクラスは次の Imdbクラスを参照します。このクラスは、各ドキュメント内のネストされた imdbフィールドをモデル化します。

[BsonIgnoreExtraElements]
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] 属性を使用して適用します。

[BsonIgnoreExtraElements]
public class Imdb
{
[BsonSerializer(typeof(FlexibleDoubleSerializer))]
public double Rating { get; set; }
[BsonSerializer(typeof(FlexibleInt32Serializer))]
public int Votes { get; set; }
public int Id { get; set; }
}

FlexibleDoubleSerializer などのカスタム シリアライザーを実装する方法については、カスタム シリアライザー を参照してください。

Atlasコレクションで検索を実行する前に、まずコレクションに検索インデックスを作成する必要があります。MongoDB 検索インデックスは、検索可能な形式でデータを分類するデータ構造です。

MongoDB 検索インデックスの作成方法については、MongoDB 検索インデックスの作成ガイドを参照してください。

The Search class contains methods you can use to perform $search operations. For a full list of available $search operators and collectors, see the Operators and Collectors Atlas guide.

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インデックスを定義する方法については、Atlas ドキュメントの「 embeddedDocument 型のインデックスの定義」を参照してください。

この節の例は、sample_restaurantsデータベースのrestaurantsコレクションを使用しています。次のクラスは、そのコレクション内のドキュメントをモデル化します。

[BsonIgnoreExtraElements]
public class Restaurant
{
[BsonId]
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!;
}
[BsonIgnoreExtraElements]
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();

To learn more about the embeddedDocument operator, see the embeddedDocument Atlas guide.

以下のセクションでは、埋め込みドキュメント検索を拡張するために使用できる追加のパラメータと演算子について説明します。

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 を参照してください。

Use the HasAncestor() method inside an EmbeddedDocument() query to filter on a field at an intermediate ancestor level of nesting. An ancestor field is an embeddedDocuments type field that is a parent of the embedded field that you specify in the returnScope parameter but is not the root document.

次のパラメータをHasAncestor()メソッドに渡します。

Parameter
必須
説明

path

はい

祖先フィールドへのパス

operator

はい

祖先フィールド内のフィールドに適用する検索演算子 path

score

No

検索結果に適用するスコア修飾子

学ぶためには、Atlas ドキュメントの has-ancestor-ref を参照してください。

埋め込みドキュメント検索を実行する際に、ルートレベルのフィールドでフィルタリングするには、HasRoot() メソッドを EmbeddedDocument() クエリ内で使用します。

次のパラメータをHasRoot()メソッドに渡します。

Parameter
必須
説明

operator

はい

ルートレベルのフィールドに適用する検索演算子。

score

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()メソッドを使用します。

次の例では、 moviesコレクションで、yearフィールドの値が 2000 であるドキュメントを検索します。

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Equals(m => m.Year, 2000))
.ToList();

equals演算子の詳細については、 Atlas ガイドと等価を参照してください。

指定されたインデックス付きフィールド名が存在するドキュメントを検索するには、Exists() メソッドを使用します。指定されたフィールドが存在してもインデックスが作成されていない場合、ドキュメントは結果セットに含まれません。

次の例では、moviesコレクションで imdb.ratingフィールドが存在するドキュメントを検索します。検索では、imdb.ratingフィールドが存在するすべてのドキュメントが返されます。

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Exists(m => m.Imdb.Rating))
.ToList();

To learn more about the exists operator, see the exists Atlas guide.

Facet() メソッドを使用して、指定されたファセットフィールドの値または範囲で結果をグループ化し、各グループのカウントを返します。

You can use the Facet() method with both the $search and $searchMeta stages. MongoDB recommends using facet with the $searchMeta stage to retrieve metadata results only for the query. To retrieve metadata results and query results using the $search stage, you must use the $$SEARCH_META aggregation variable. To learn more about this variable, see the SEARCH_META Aggregation Variable Atlas guide.

次の制限が適用されます。

  • ファセット クエリは単一のフィールドに対してのみ実行できます。フィールドのグループに対してファセット クエリを実行することはできません。

  • 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()メソッドを使用して、特定のジオメトリに関連するドキュメントを検索します。 検索する座標を指定する場合は、最初に 経度 、次に 緯度 を指定する必要があります。 経度の値は、両端を含む-180から180までです。 緯度の値は、両端を含む-90から90までです。

注意

MongoDB Search は以下の機能をサポートしていません。

  • 非デフォルトの座標参照システム(CRS)

  • 平面 XY 座標系 (2 次元)

  • 座標ペアのポイント表記(pointFieldName: [12, 34])

この例では、sample_mflixデータベースの theatersコレクションを使用します。次の クラスは、そのコレクション内のドキュメントをモデル化します。

[BsonIgnoreExtraElements]
public class Theater
{
[BsonId]
public ObjectId Id { get; set; }
public int TheaterId { get; set; }
public TheaterLocation Location { get; set; } = null!;
}
[BsonIgnoreExtraElements]
public class TheaterLocation
{
[BsonElement("geo")]
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 ガイドを参照してください。

Use the GeoWithin() method to search for documents in which the coordinates of their specified GeoJSON field are within a given geometry. You can search for points that are within a:

  • 円

  • 境界ボックス

  • 多角形

検索する座標を指定する場合は、最初に 経度 、次に 緯度 を指定する必要があります。 経度の値は、両端を含む-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();

To learn more about the geoWithin operator, see the geoWithin Atlas guide.

指定値のリストと一致するフィールド値を持つドキュメントを検索するには、In() メソッドを使用します。

次の例では、 moviesコレクションで、"Action" または "Comedy" のいずれかを含む genres 配列を持つドキュメントを検索します。

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.In(m => m.Genres, new[] { "Action", "Comedy" }))
.ToList();

入力ドキュメントに類似するドキュメントを検索するには、 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();

To learn more about the moreLikeThis operator, see the moreLikeThis Atlas guide.

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();

To learn more about the near operator, see the near Atlas guide.

指定したフィールドに入力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();

To learn more about the phrase operator, see the phrase Atlas guide.

QueryString()メソッドを使用して、次の演算子と区切り文字を含む string を使用してドキュメントを検索します。

  • AND

  • OR

  • NOT

  • ()

次の例では、 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();

To learn more about the queryString operator, see the queryString Atlas guide.

Range() メソッドを使用して、指定フィールドの値が特定の数値、日付、または文字列の範囲内にあるドキュメントを検索します。

次の例では、 moviesコレクションで、year の値が 2000 より大きく 2010 より小さいすべてのドキュメントを検索します。

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search
.Range(m => m.Year, SearchRangeBuilder.Gt(2000).Lt(2010)))
.ToList();

指定したフィールドの値が string の範囲内にあるドキュメントを検索するには、まずフィールドに トークンインデックスを作成する必要があります。インデックスを作成 したら、string の範囲に基づいてドキュメントを検索できます。次の例では、title フィールドの値が"A" と の間にあるドキュメントを辞書順に比較して返します。"G"

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search
.Range(m => m.Title, SearchRangeV2Builder.Gte("A").Lte("G")))
.ToList();

range演算子の詳細については、 Atlas の範囲ガイド を参照してください。

正規表現を使用してドキュメントを検索するには、 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演算子は、クエリが位置情報を追跡する必要があるため、他の演算子よりも計算負荷が高くなります。

次の例では、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 ガイドの範囲を参照してください。

ドキュメント内で指定された 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 内の各タームの一致も個別に検索します

To learn more about the text operator, see the text Atlas guide.

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 に設定すると、予期しない検索結果が発生する可能性があります。 詳しくは、「ワイルドカードの動作 」を参照してください。

To learn more about the wildcard operator, see the wildcard Atlas guide.

検索するフィールドへのパスは、SearchPathDefinitionBuilderクラスを使用して指定できます。Builders<TDocument>.SearchPath を使用して SearchPathDefinitionBuilderインスタンスにアクセスし、そのメソッドの 1 つを呼び出して検索パスを指定します。次のセクションでは、利用可能なメソッドについて説明します。

Tip

検索パス

To learn more about search paths, see Construct a Query Path in the Atlas documentation.

検索パスとして 1 つのフィールドを指定するには、Single() メソッドを使用します。次の例は、フィールドを指定する 3 つの方法です。型指定されたモデルでラムダ式を使用する、実行時に値が既知であるfieldName変数やメソッド パラメータなどの文字列フィールド名を渡します、または型指定されていないドキュメントを使用します。

注意

The field that you pass to the Single() method must be included in the search index definition. If the field isn't included, MongoDB Server returns an empty result set without returning an error.

型付きモデルを操作していて、コンパイル時にフィールド名がわかっている場合は、 lambda 式を使用します。この形式では、コンパイル時に型をチェックできます。

次の例では、 plotフィールドでテキスト "secret agent" を含むドキュメントを検索します。

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Text(
Builders<Movie>.SearchPath.Single(m => m.Plot), "secret agent"))
.ToList();

型付きモデルを操作しているが、コンパイル時にフィールド名が不明な場合は、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 オブジェクトを操作する場合は、フィールド名を string として指定する必要があります。

次の例では、型なしのコレクションで、テキスト "secret agent" を含むドキュメントを plotフィールドで検索します。

var result = moviesCollectionBson.Aggregate()
.Search(Builders<BsonDocument>.Search.Text(
Builders<BsonDocument>.SearchPath.Single("plot"), "secret agent"))
.ToList();

複数のフィールドの検索パスを指定するには、Multi() メソッドを使用します。結果セットには、指定されたフィールドのいずれかに一致するドキュメントが含まれます。

注意

You must include all fields that you pass to the Multi() method in the search index definition. If you pass a field that isn't included, MongoDB Server silently excludes it from the search.

次の例では、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();

Analyzers process text into searchable tokens by applying operations such as lowercasing. MongoDB Server applies an analyzer when indexing a field and again when running a query against that field. If you specify the multi option when you create a search index, MongoDB Server also stores a second set of tokens produced by an alternate analyzer.

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();

Tip

アナライザ

To learn more about analyzers, see Analyzers in the Atlas documentation.

フィールド名を一致させるためにワイルドカード文字を使用する検索パスを指定するには、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();

注意

ワイルドカード パフォーマンス

"*" などの幅広いパターンはすべてのインデックス付きフィールドに一致するため、大規模なインデックスではクエリ パフォーマンスに影響を与える可能性があります。

To learn more about wildcard paths, see Construct a Query Path in the Atlas documentation.

MongoDB Server assigns a relevance score to every document that it returns from a MongoDB Search query. The query returns the documents in order from highest score to lowest. To learn more about how scores are assigned, see the score Atlas guide.

返されたドキュメントに割り当てられるスコアは、ドキュメントのメタデータの一部です。集計パイプラインで $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();

SearchOptionsオブジェクトをパラメーターとして渡すことで、Search() メソッドの動作を変更できます。

SearchOptionsクラスには、次のプロパティが含まれています。

プロパティ
説明

CountOptions

検索結果をカウントするオプション。

データ型: SearchCountOptions
デフォルト: null

Highlight

元のコンテキストで検索期間を表示するためのオプション。

データ型: SearchHighlightOptions<TDocument>
デフォルト: null

IndexName

検索に使用するインデックス。

Data type: string
Default: null

ReturnStoredSource

データベースでドキュメント全体を検索するか、MongoDB Search から直接保存されたソース フィールドのみを返すかを指定するフラグです。

Data type: boolean
Default: false

ScoreDetails

結果内の各ドキュメントのスコアに関する詳細情報を返すかどうかを指定するフラグ。

Data type: boolean
Default: false

SearchAfter

ページ分けの開始点。設定すると、検索は指定された参照点の直後からドキュメントを検索します。

Data type: string
Default: null

SearchBefore

ページ分けの終点。設定すると、指定された参照点の直前からドキュメントの検索が開始されます。

Data type: string
Default: null

Sort

結果に適用するソート条件。

Data type: SortDefinition<TDocument>
Default: null

Tracking

検索期間を追跡するためのオプション。

データ型: SearchTrackingOptions
デフォルト: null

次の例では、次のアクションを実行して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();

Tip

ページ分割のドキュメント

To learn more about MongoDB Search pagination, see Paginate the Results in the Atlas documentation.