Overview
このガイドでは、 Searchビルダーを使用して MongoDB .NET/C# ドライバーで$search集計パイプライン ステージを構築する方法を学びます。
$searchパイプライン ステージの詳細については、 $search を参照してください。
注意
MongoDB v4.2 以降の Atlas で利用可能
$search集計パイプライン演算子は、 MongoDB SearchインデックスによってカバーされているMongoDB v 以降を実行中MongoDB4.2 Atlasクラスターでホストされているコレクションで使用できます。必要な設定とこの演算子の機能の詳細については、 MongoDB 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 クラスのプロパティにマップします。
カスタム直列化について詳しくは、「 カスタム直列化 」を参照してください。
MongoDB Search インデックスの作成
Atlasコレクションで検索を実行する前に、まずコレクションにMongoDB Searchインデックスを作成する必要があります。 MongoDB Searchインデックスは、 検索可能な形式でデータを分類するデータ構造です。
MongoDB Search インデックスの作成方法については、「 MongoDB Search インデックスの作成 」ガイドを参照してください。
MongoDB Search 演算子
Searchクラスには、 $search操作を実行するために使用できるメソッドが含まれています。 使用可能な$search演算子の完全なリストについては、Atlas の演算子とコレクターのガイドを参照してください。
オートコンプリート
Autocomplete()メソッドを使用して、不完全な入力 string からの文字シーケンスを含む単語またはフレーズを検索します。
次の例では、make フィールドで "Gib" で始まる文字列に対してオートコンプリート クエリを実行します。
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Autocomplete(g => g.Make, "Gib"), indexName: "guitarmakes") .ToList();
注意
オートコンプリート クエリ用インデックス
オートコンプリート クエリを正常に実行するには、 オートコンプリート をサポートするMongoDB Searchインデックスを作成する必要があります。詳細については、Atlas ドキュメントの「 オートコンプリート用にフィールドをインデックスする方法 」を参照してください。
MongoDB Searchインデックスの作成後、前述のコードに示すように、インデックス名を Autocomplete() メソッドに渡す必要があります。
検索では、次のドキュメントが返されます。
{ "_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複合ガイド をご覧ください。
embeddedDocument
EmbeddedDocument()メソッドを使用して、フィールドの配列値内のドキュメントに対して検索操作を実行します。
注意
埋め込みドキュメントを検索するには、配列フィールドにembeddedDocumentインデックスを作成する必要があります。
embeddedDocumentインデックスを定義する方法については、Atlas ドキュメントの「 embeddedDocument 型のインデックスの定義」を参照してください。
guitarsコレクション内の一部のドキュメントには、製品詳細オブジェクトの配列を保持するproductDetailsフィールドが追加されているとします。
{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in_stock": true, "rating": 9, "productDetails": [{"product_id": 1234, "serial": "YZ5678"}] } { "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in_stock": true, "rating": 8 } { "_id": 3, "make": "PRS", "description": "...", "establishedYear": 1985, "in_stock": true, "rating": 9, "productDetails": [{"product_id": 9870, "serial": "AB5555"}] } { "_id": 4, "make": "Kiesel", "description": "...", "establishedYear": 2015, "in_stock": false } { "_id": 5, "make": "Ibanez", "description": "...", "establishedYear": 1957, "in_stock": true, "rating": 7, "productDetails": [{"product_id": 5432, "serial": "ZZ1234"}] } { "_id": 6, "make": "Strandberg", "description": "...", "establishedYear": 1982, "in_stock": false }
productDetailsフィールドに embeddedDocumentインデックスを作成すると、そのフィールドのドキュメントに対してMongoDB Search 操作を実行できます。次の例では、productDetails 配列フィールドでテキスト検索を実行し、serialフィールド値が "YZ5678" であるドキュメントを返します。
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.EmbeddedDocument( g => g.ProductDetails, Builders<ProductDetails>.Search.Text(p => p.Serial, "YZ5678") )).ToList(); return result;
検索では、次のドキュメントが返されます。
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9, "productDetails" : [{ "product_id" : 1234, "serial" : "YZ5678" }] }
embeddedDocument演算子の詳細については、 embeddedDocument 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までです。
注意
MongoDB 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までです。
注意
MongoDB 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 ガイド を参照してください。
で
指定値のリストと一致するフィールド値を持つドキュメントを検索するには、In() メソッドを使用します。
次の例では、 guitarsコレクションで、makeフィールドの値が "Fender" または "Gibson" のいずれかであるドキュメントを検索します。
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.In(g => g.Make, ["Fender", "Gibson"])) .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 }
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 を使用してドキュメントを検索します。
ANDORNOT()
次の例では、 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 }
指定したフィールドの値が文字列の範囲内にあるドキュメントを検索するには、まずフィールドにトークンインデックスを作成する必要があります。インデックスを作成した後、次の例に示すように、文字列の範囲に基づいてドキュメントを検索できます。
// Performs MongoDB Search queries by using the C# driver using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.Conventions; using MongoDB.Driver; using MongoDB.Driver.GeoJsonObjectModel; using MongoDB.Driver.Search; public class AtlasSearchExamples { private static IMongoCollection<Guitar> guitarsCollection; private static string _mongoConnectionString = "<connection string>"; public static void Main(string[] args) { Setup(); var results = AutocompleteSearch(); foreach (var g in results) { Console.WriteLine(g.ToBsonDocument()); } } public static List<Guitar> AutocompleteSearch() { // Finds documents with a "make" value that contains the string fragment "Gib" // start-autocomplete-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Autocomplete(g => g.Make, "Gib"), indexName: "guitarmakes") .ToList(); // end-autocomplete-search return result; } public static List<Guitar> CompoundSearch() { // Find documents that meet multiple search criteria by using the // Compound() search function // start-compound-search 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(); // end-compound-search return result; } public static List<Guitar> EmbeddedDocumentSearch() { // start-embedded-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.EmbeddedDocument( g => g.ProductDetails, Builders<ProductDetails>.Search.Text(p => p.Serial, "YZ5678") )).ToList(); return result; // end-embedded-search } public static List<Guitar> EqualsSearch() { // start-equals-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Equals(g => g.InStock, true)) .ToList(); // end-equals-search return result; } public static List<Guitar> ExistsSearch() { // start-exists-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Exists(g => g.Rating)) .ToList(); // end-exists-search return result; } public static List<Guitar> GeoShapeSearch() { // start-geoshape-search 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(); // end-geoshape-search return result; } public static List<Guitar> GeoWithinSearch() { // start-geowithin-search 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(); // end-geowithin-search return result; } public static List<Guitar> InSearch() { // start-in-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.In(g => g.Make, ["Fender", "Gibson"])) .ToList(); // end-in-search return result; } public static List<Guitar> MoreLikeThisSearch() { // start-morelikethis-search var searchDocument = new GuitarSearch() { Description = "high quality", }; var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.MoreLikeThis(searchDocument)) .ToList(); // end-morelikethis-search return result; } public static List<Guitar> NearSearch() { // start-near-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Near(g => g.Rating, 9, 1)) .ToList(); // end-near-search return result; } public static List<Guitar> PhraseSearch() { // start-phrase-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Phrase(g => g.Description, "classic guitars")) .ToList(); // end-phrase-search return result; } public static List<Guitar> PhraseMultipleSearch() { // start-multiphrase-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Phrase(g => g.Description, new List<string>() { "classic guitars", "quality guitars" })) .ToList(); // end-multiphrase-search return result; } public static List<Guitar> QueryStringSearch() { // start-querystring-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.QueryString(g => g.Description, "(classic OR quality) AND NOT custom")) .ToList(); // end-querystring-search return result; } public static List<Guitar> RangeSearch() { // start-range-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Range(g => g.EstablishedYear, SearchRangeBuilder.Gt(1980).Lt(2020))) .ToList(); // end-range-search return result; } public static List<Guitar> RegexSearch() { // start-regex-search var regex = "[A-Za-z]{6}"; var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Regex(g => g.Make, regex)) .ToList(); // end-regex-search return result; } public static List<Guitar> SpanSearch() { // start-span-search 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(); // end-span-search return result; } public static List<Guitar> TextSearch() { // start-text-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Text(g => g.Description, "used by professional")) .ToList(); // end-text-search return result; } public static List<Guitar> WildcardSearch() { // start-wildcard-search var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Wildcard(g => g.Make, "Strand*")) .ToList(); // end-wildcard-search return result; } private static void Setup() { // This allows automapping of the camelCase database fields to our models. var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); // Establish the connection to MongoDB and get the restaurants database var mongoClient = new MongoClient(_mongoConnectionString); var restaurantsDatabase = mongoClient.GetDatabase("sample_guitars"); guitarsCollection = restaurantsDatabase.GetCollection<Guitar>("guitars"); } } public class GuitarSearch { public string Description { get; set; } } public class Guitar { public int Id { get; set; } public string Make { get; set; } public string Description { get; set; } public int EstablishedYear { get; set; } [] public bool InStock { get; set; } [] public Location InStockLocation { get; set; } public int? Rating { get; set; } } public class Location { public string Type { get; set; } public List<decimal> Coordinates { get; set; } }
前の例では、フィールド make の文字列値が "Fender" 以上かつ "Kiesel" 以下であるドキュメントを検索します。ドライバーは、文字列の値を辞書式順序に比較します。
この検索では、次の結果が返されます。
{ "_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 }
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 に複数の検索タームがある場合、 MongoDB Search は 文字列内の各タームの一致も個別に検索します
次の例では、 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 のガイドを参照してください。