Docs Menu
Docs Home
/ / /
C#/.NET
/

Atlas Search

項目一覧

  • Overview
  • Atlas Search インデックスの作成
  • Atlas Search 演算子
  • オートコンプリート
  • 複合
  • equals
  • exists
  • geoShape
  • geoWithin
  • moreLikeThis
  • near
  • phrase
  • queryString
  • Range(範囲)
  • regex
  • span
  • Text
  • ワイルドカード

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

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

注意

MongoDB v4.2 以降の Atlas でのみ利用可能

$search集計パイプライン演算子は、 インデックスMongoDB Atlas によってカバーされるMongoDB v4.2 以降を実行しているAtlas Search クラスターでホストされているコレクションでのみ使用できます。必要な設定とこの演算子の機能の詳細については、 Atlas Searchのドキュメントを参照してください。

このガイドの例では、 guitarsというコレクション内の次のドキュメントを使用します。

{ "_id": 1, "make": "Fender", "description": "Classic guitars known for their versatility.", "establishedYear": 1946, "in-stock": true, "rating": 9 }
{ "_id": 2, "make": "Gibson", "description": "Classic guitars known for their rich, full tones.", "establishedYear": 1902, "in-stock": true, "rating": 8 }
{ "_id": 3, "make": "PRS", "description": "High-end guitars known for their quality.", "establishedYear": 1985, "in-stock": true, "rating": 9 }
{ "_id": 4, "make": "Kiesel", "description": "Quality guitars made only for custom orders.", "establishedYear": 2015, "in-stock": false }
{ "_id": 5, "make": "Ibanez", "description": "Well-crafted guitars used by many professional guitarists.", "establishedYear": 1957, "in-stock": true, "rating": 7 }
{ "_id": 6, "make": "Strandberg", "description": "Modern guitars known for their headless models.", "establishedYear": 1982, "in-stock": false }

次のGuitarクラスは、このコレクション内のドキュメントをモデル化します。

public class Guitar
{
public int Id { get; set; }
public string Make { get; set; }
public List<string> Models { get; set; }
public int EstablishedYear { get; set; }
[BsonElement("in-stock")]
public bool InStock { get; set; }
public int? Rating { get; set; }
}

注意

guitars コレクションのドキュメントは、キャメル ケースの命名規則を使用します。このガイドの例では、ConventionPack を使用してコレクション内のフィールドをパスカル ケースに逆シリアル化し、Guitar クラスのプロパティにマップします。

カスタム直列化について詳しくは、「 カスタム直列化 」を参照してください。

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

Atlas Search インデックスの作成方法については、「 Atlas Search インデックス Atlas の作成 」ガイドを参照してください。

Searchクラスには、 $search操作を実行するために使用できるメソッドが含まれています。 使用可能な$search演算子の完全なリストについては、Atlas の演算子とコレクターのガイドを参照してください。

注意

Searchクラスは現在、 $embeddedDocument演算子をサポートしていません。

Autocompleteメソッドを使用して、不完全な入力 string からの文字シーケンスを含む単語またはフレーズを検索します。

次の例では、 makeフィールドに string「Git」を使用して、 guitarsコレクションでオートコンプリート検索を実行します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Autocomplete(g => g.Make, "Gib"))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in-stock" : true, "rating" : 8 }

autocomplete演算子の詳細については、Atlas のオートコンプリートガイドを参照してください。

2 つ以上の演算子を 1 つの検索に結合するには、 Compoundメソッドを使用します。

次の例では、 guitarsコレクションで次のすべての条件に一致するドキュメントを検索します。

  • ratingフィールドはドキュメントに存在する

  • in-stockフィールドはfalseではありません

  • establishedYearフィールドの値が 1940 より大きい

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Compound()
.Must(Builders<Guitar>.Search.Exists(g => g.Rating))
.MustNot(Builders<Guitar>.Search.Equals(g => g.InStock, false))
.Must(Builders<Guitar>.Search.Range(g => g.EstablishedYear, SearchRangeBuilder.Gt(1940))))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in-stock" : true, "rating" : 9 }
{ "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in-stock" : true, "rating" : 9 }
{ "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in-stock" : true, "rating" : 7 }

compound演算子の詳細については、 Atlas複合ガイド をご覧ください。

フィールドが指定された値と一致するかどうかを確認するには、 Equalsメソッドを使用します。

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

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Equals(g => g.InStock, true))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in-stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "...", "establishedYear" : 1902, "in-stock" : true, "rating" : 8 }
{ "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in-stock" : true, "rating" : 9 }
{ "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in-stock" : true, "rating" : 7 }

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

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

次の例では、 guitarsコレクションでratingフィールドが存在するドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Exists(g => g.Rating))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in-stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "...", "establishedYear" : 1902, "in-stock" : true, "rating" : 8 }
{ "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in-stock" : true, "rating" : 9 }
{ "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in-stock" : true, "rating" : 7 }

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

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

注意

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

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

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

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

guitarsコレクション内の一部のドキュメントにはin-stock-locationフィールドが追加されています。 コレクション内の変更されたドキュメントは、次のようになります。

{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in-stock": true, "in-stock-location": { "type": "Point", "coordinates": [ -73.93615, 40.69791 ]}, "rating": 9 }
{ "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in-stock": true, "in-stock-location": { "type": "Point", "coordinates": [ 47.6062, 122.321 ]}, "rating": 8 }

次の例では、 in-stock-locationフィールドの座標が指定された多角形と交差しているすべてのドキュメントを検索します。

GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[]
{
new(-72.93615, 41.69791),
new(-72.93615, 40.59791),
new(-74.93615, 40.59791),
new(-74.93615, 41.69791),
new(-72.93615, 41.69791),
})));
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.GeoShape(g => g.InStockLocation, GeoShapeRelation.Intersects, searchArea))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in-stock" : true, "in-stock-location" : { "type" : "Point", "coordinates" : ["-73.93615", "40.69791"] }, "rating" : 9 }

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

GeoWithinメソッドを使用して、指定されたGeoJSONフィールドの座標が特定のジオメトリ内にあるドキュメントを検索します。 内にあるポイントを検索できます。

  • 境界ボックス

  • 多角形

検索する座標を指定する場合は、最初に 経度 、次に 緯度 を指定する必要があります。 経度の値は、両端を含む-180から180までです。 緯度の値は、両端を含む-90から90までです。

注意

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

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

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

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

guitarsコレクション内の一部のドキュメントにはin-stock-locationフィールドが追加されています。 コレクション内の変更されたドキュメントは、次のようになります。

{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in-stock": true, "in-stock-location": { "type": "Point", "coordinates": [ -73.93615, 40.69791 ]}, "rating": 9 }
{ "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in-stock": true, "in-stock-location": { "type": "Point", "coordinates": [ 47.6062, 122.321 ]}, "rating": 8 }

次の例では、 in-stock-locationフィールドの座標が指定された多角形内にあるすべてのドキュメントを検索します。

GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[]
{
new(-74.3994140625, 40.5305017757),
new(-74.7290039063, 40.5805846641),
new(-74.7729492188, 40.9467136651),
new(-74.0698242188, 41.1290213475),
new(-73.65234375, 40.9964840144),
new(-72.6416015625, 40.9467136651),
new(-72.3559570313, 40.7971774152),
new(-74.3994140625, 40.5305017757),
})));
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.GeoWithin(g => g.InStockLocation, searchArea))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in-stock" : true, "in-stock-location" : { "type" : "Point", "coordinates" : ["-73.93615", "40.69791"] }, "rating" : 9 }

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

入力ドキュメントに類似するドキュメントを検索するには、 MoreLikeThisメソッドを使用します。

次の例では、 guitarsコレクションで、 Descriptionフィールドの値が「高品質」であるオブジェクトに類似しているドキュメントを検索します。

var searchDocument = new GuitarSearch()
{
Description = "high quality",
};
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.MoreLikeThis(searchDocument))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 3, "make" : "PRS", "description" : "High-end guitars known for their quality.", "establishedYear" : 1985, "in-stock" : true, "rating" : 9 }
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in-stock" : false, "rating" : null }

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

Nearメソッドを使用して、指定したフィールドが指定の値に近いドキュメントを検索します。 検索は、次に対して実行できます。

  • 数値フィールド

  • 日付フィールド

  • 地理的ポイント

次の例では、 guitarsコレクションで、 ratingフィールドの値が9に近いドキュメントを検索します。 値が数値9にどのように近いかに基づいて、ドキュメントは順番に返されます。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Near(g => g.Rating, 9, 1))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in-stock" : true, "rating" : 9 }
{ "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in-stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "...", "establishedYear" : 1902, "in-stock" : true, "rating" : 8 }
{ "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in-stock" : true, "rating" : 7 }

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

指定したフィールドに入力stringが含まれているドキュメントを検索するには、Phrase メソッドを使用します。

次の例では、 guitarsコレクションで、 descriptionフィールドに「ClassicReads」というフレーズが含まれているドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Phrase(g => g.Description, "classic guitars"))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in-stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in-stock" : true, "rating" : 8 }

次のように、 コレクションで複数の個別のフレーズに一致するドキュメントを検索することもできます。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Phrase(g => g.Description, new List<string>() { "classic guitars", "quality guitars" }))
.ToList();

この検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in-stock" : true, "rating" : 9 }
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in-stock" : false, "rating" : null }
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in-stock" : true, "rating" : 8 }

phrase演算子について詳しくは、Atlas ガイドのフレーズを参照してください。

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

  • AND

  • OR

  • NOT

  • ()

次の例では、 guitarsコレクションで、 descriptionフィールドの値が次の各条件に一致するドキュメントを検索します。

  • string "Classic"またはstring "quality" が含まれます

  • "custom" という string を含まない

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.QueryString(g => g.Description, "(classic OR quality) AND NOT custom"))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in-stock" : true, "rating" : 9 }
{ "_id" : 3, "make" : "PRS", "description" : "High-end guitars known for their quality.", "establishedYear" : 1985, "in-stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in-stock" : true, "rating" : 8 }

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

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

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

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Range(g => g.EstablishedYear, SearchRangeBuilder.Gt(1980).Lt(2020)))
.ToList();

この検索では、次の結果が返されます。

{ "_id" : 3, "make" : "PRS", "description" : "High-end guitars known for their quality.", "establishedYear" : 1985, "in-stock" : true, "rating" : 9 }
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in-stock" : false, "rating" : null }
{ "_id" : 6, "make" : "Strandberg", "description" : "Modern guitars known for their headless models.", "establishedYear" : 1982, "in-stock" : false, "rating" : null }

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

正規表現を使用してドキュメントを検索するには、 Regexメソッドを使用します。

次の例では、 guitarsコレクションで、 makeフィールドの値に 6 文字だけが含まれているドキュメントを検索します。

var regex = "[A-Za-z]{6}";
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Regex(g => g.Make, regex))
.ToList();

この検索では、次の結果が返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in-stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in-stock" : true, "rating" : 8 }
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in-stock" : false, "rating" : null }
{ "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 1957, "in-stock" : true, "rating" : 7 }

注意

デフォルトでは、 regex演算子は分析対象フィールドでは実行できません。 次のように、 allowAnalyzedFieldオプションを true に設定することで、分析フィールドで実行できるようになります。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Regex(g => g.Make, regex, true))
.ToList();

allowAnalyzedFieldオプションを true に設定すると、予期しない検索結果が発生する可能性があります。 詳しくは、「正規表現の動作 」を参照してください。

regex演算子の詳細については、 Atlas ガイドの正規表現を参照してください。

フィールドのリージョン内に一致するテキスト検索を検索するには、 Spanメソッドを使用します。 このメソッドを使用すると、指定した精度で相互に近い文字列を検索できます。

注意

span演算子は、クエリが位置情報を追跡する必要があるため、他の演算子よりも計算負荷が高くなります。

次の例では、 guitarsコレクションで、 descriptionフィールドの値に 1 単語以内の string が含まれているドキュメントを検索します。

var searchTerms = new[]
{
Builders<Guitar>.SearchSpan.Term(g => g.Description, "guitars"),
Builders<Guitar>.SearchSpan.Term(g => g.Description, "quality")
};
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Span(Builders<Guitar>.SearchSpan.Near(searchTerms, 1)))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in-stock" : false, "rating" : null }

_id: 3を含むドキュメントには「groups」と「quality」という文字列が含まれていますが、これらは複数の単語で区切られているため、検索ではこのドキュメントが結果から除外されます。

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

ドキュメント内で指定された string または string の配列を検索するには、 Textメソッドを使用します。 特定の string に複数の検索タームがある場合、Atlas Search は string 内の各タームの一致も個別に検索します

次の例では、 guitarsコレクションで、 descriptionフィールドの値に「プロが使用する」という string が含まれているドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Text(g => g.Description, "used by professional"))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 1957, "in-stock" : true, "rating" : 7 }

Tip

検索 string に複数のタームが含まれている場合、このメソッドは string 内の各タームの一致も個別に検索します

text演算子の詳細については、Atlas ガイドのテキストを参照してください。

Wildcard メソッドを使用して、検索stringに任意の文字に一致する特殊文字を使用してドキュメントを検索します。 検索では、次の文字を使用できます。

文字
説明
?
任意の 1 文字と一致
*
0 文字以上の文字と一致
\
エスケープ文字

次の例では、 makeフィールドの値に string「Strand」とそれに続く他の文字が含まれているドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Wildcard(g => g.Make, "Strand*"))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 6, "make" : "Strandberg", "description" : "Modern guitars known for their headless models.", "establishedYear" : 1982, "in-stock" : false, "rating" : null }

注意

デフォルトでは、 wildcard演算子は分析対象フィールドでは実行できません。 次のように、 allowAnalyzedFieldオプションを true に設定することで、分析フィールドで実行できるようになります。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Wildcard(g => g.Make, "Strand*", true))
.ToList();

allowAnalyzedFieldオプションを true に設定すると、予期しない検索結果が発生する可能性があります。 詳しくは、「ワイルドカードの動作 」を参照してください。

wildcard演算子の詳細については、ワイルドカードAtlas のガイドを参照してください。

戻る

ビルダを用いた操作