Atlas Search
項目一覧
Overview
このガイドでは、 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; } [ ] public bool InStock { get; set; } public int? Rating { get; set; } }
注意
guitars
コレクションのドキュメントは、キャメル ケースの命名規則を使用します。このガイドの例では、ConventionPack
を使用してコレクション内のフィールドをパスカル ケースに逆シリアル化し、Guitar
クラスのプロパティにマップします。
カスタム直列化について詳しくは、「 カスタム直列化 」を参照してください。
Atlas Search インデックスの作成
Atlas コレクションで検索を実行する前に、まずコレクションにAtlas Search インデックスを作成する必要があります。 Atlas Search インデックスは、検索可能な形式でデータを分類するデータ構造です。
Atlas Search インデックスの作成方法については、「 Atlas Search インデックス Atlas の作成 」ガイドを参照してください。
Atlas Search 演算子
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
フィールドが指定された値と一致するかどうかを確認するには、 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
指定されたインデックス付きフィールド名が存在するドキュメントを検索するには、 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
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
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
入力ドキュメントに類似するドキュメントを検索するには、 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
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 ガイドを参照してください。
phrase
指定したフィールドに入力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
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(範囲)
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
正規表現を使用してドキュメントを検索するには、 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
メソッドを使用します。 このメソッドを使用すると、指定した精度で相互に近い文字列を検索できます。
注意
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 ガイドの範囲を参照してください。
Text
ドキュメント内で指定された 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 のガイドを参照してください。