Overview
在本指南中,您可以了解如何使用 Search 生成器,通过 MongoDB .NET/C# 驱动程序构建一个聚合管道阶段。
要了解有关 $search 管道阶段的更多信息,请参阅 $search。
注意
适用于Atlas for MongoDB v4.2 及更高版本
$search聚合管道操作符可用于在运行MongoDB v 或更高版本的MongoDB4.2 Atlas集群上托管的集合,这些集群由MongoDB Search索引覆盖。要学习;了解有关此操作符所需设置和功能的更多信息,请参阅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 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 double Score {get; set;} [] public string PaginationToken { get; set; } }
注意
guitars 集合中的文档使用驼峰命名约定。本指南中的示例使用 ConventionPack 将集合中的字段反序列化为 Pascal 语句,然后映射到 Guitar 类中的属性。
如需了解有关自定义序列化的更多信息,请参阅自定义序列化。
创建MongoDB搜索索引
在对Atlas集合执行搜索之前,必须先在该集合上创建MongoDB Search索引。 MongoDB搜索索引是一种以可搜索格式对数据进行分类的数据结构。
MongoDB Search 操作符和收集器
Search 类包含可用于执行 $search 操作的方法。有关可用 $search 操作符和收集器的完整列表,请参阅Atlas操作符和收集器指南。
自动完成(Autocomplete)
使用 Autocomplete() 方法,搜索包含不完整输入字符串中的字符序列的单词或短语。
以下示例对以字符串 "Gib" 开头的文本的 make 字段执行自动完成查询。
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Autocomplete(g => g.Make, "Gib"), indexName: "guitarmakes") .ToList();
注意
自动完成查询的索引
此搜索将返回如下文档:
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }
要了解有关 autocomplete 操作符的更多信息,请参阅 autocomplete Atlas 指南。
多个子句
使用 Compound() 方法将两个或更多操作符组合到单次搜索中。
以下示例在 guitars 集合中搜索符合以下所有条件的任何文档:
文档上存在
rating字段in_stock字段不是falseestablishedYear字段的值大于 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 操作符的更多信息,请参阅 compound Atlas 指南。
嵌入式文档
使用 EmbeddedDocument() 方法对字段的数组值中的文档执行搜索操作。
注意
要对嵌入式文档进行Atlas Search ,您必须在数组字段上创建 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 操作符的更多信息,请参阅 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 操作符的更多信息,请参阅exists Atlas 指南。
Facet
使用 Facet() 方法按指定分面字段中的值或范围对结果进行分组,并返回每个组的计数。
您可以将 Facet() 方法同时用于 $search 和 $searchMeta 阶段。MongoDB建议使用带有 $searchMeta 阶段的分面(Facet)来检索仅针对查询 的元数据结果。要使用 $search 阶段检索元数据结果和查询结果,必须使用 $$SEARCH_META聚合变量。要学习;了解有关此变量的更多信息,请参阅 SEARCH_META 聚合变量 Atlas指南。
适用以下限制:
只能对单个字段运行分面查询。无法对字段群组运行分面查询。
只能在运行 MongoDB v6.0 的集群上对分片集合运行分面查询。
如下示例会在 guitars 集合中搜索 in_stock 字段值为 true 的任何文档。查询使用 Facet() 方法处理输入文档,结果中最多返回 100 个分面类别。该查询返回 in_stock 值为 true 的文档总数。
var result = guitarsCollection.Aggregate() .SearchMeta( Builders<Guitar>.Search.Facet( Builders<Guitar>.Search.Equals(g => g.InStock, true), Builders<Guitar>.SearchFacet.String("string", g => g.Make, 100)), indexName: "guitarfacetsearch") .Single() .Facet["string"].Buckets.Count();
搜索将返回以下结果:
4
如要了解有关 facet 收集器的更多信息,请参阅分面 Atlas 指南。
GeoShape
使用 GeoShape() 方法搜索与给定的几何图形相关的文档。当指定要搜索的坐标时,必须首先指定经度,然后指定纬度。经度值可以介于 -180 到 180(含)之间。纬度值可以介于 -90 到 90(含)之间。
注意
MongoDB Search 不支持以下内容:
非默认坐标参考系 (CRS)
平面 XY 坐标系(二维)
坐标对 点符号 (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 坐标系(二维)
坐标对 点符号 (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() 方法搜索与输入文档类似的文档。
以下示例会在 guitars 集合中搜索与 Description 字段值为“high quality”的对象相似的文档。
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 操作符的更多信息,请参阅 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 操作符的更多信息,请参阅 near Atlas 指南。
短语
使用 Phrase() 方法搜索指定字段包含输入字符串的文档。
如下示例将在 guitars 集合中搜索 description(说明)字段包含短语“classic guitars”的文档。
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() 方法,将一个字符串与以下操作符和分隔符结合使用以搜索文档:
ANDORNOT()
以下示例会在 guitars 集合中搜索 description 字段的值与以下每个条件匹配的文档:
包含字符串“classic”或字符串“quality”
不包含字符串“自定义”
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 操作符的更多信息,请参阅 queryString Atlas 指南。
范围
使用 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 }
如要搜索指定字段的值在字符串范围内的文档,您必须首先在该字段上创建令牌索引。创建索引后,您可以根据字符串范围搜索文档,如下例所示:
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search .Range(g => g.Make, SearchRangeV2Builder.Gte("Fender").Lte("Kiesel"))) .ToList();
前面的示例搜索 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 操作符的更多信息,请参阅 range Atlas 指南。
正则表达式(Regex)
使用 Regex() 方法使用正则表达式搜索文档。
以下示例会在 guitars 集合中搜索 make 字段的值恰好包含六个字母的文档。
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 行为。
要了解有关 regex 操作符的更多信息,请参阅 regex Atlas 指南。
span
使用 Span() 方法,搜索字段区域内的文本搜索匹配项。您可以使用该方法,按照指定的精度查找相似的字符串。
注意
span 操作符比其他操作符的计算量更大,因为查询必须跟踪位置信息。
如下示例将在 guitars 集合中搜索 description(说明)字段的值包含彼此相邻的字符串“guitars”和“quality”的文档。
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 的文档包含字符串“guitars”和“quality”,但它们由多个单词分隔,搜索结果忽略了该文档。
要了解有关 span 操作员的更多信息,请参阅 span Atlas 指南。
Text
使用 Text() 方法在文档搜索给定的字符串或字符串大量。如果给定字符串中有多个词, MongoDB Search 还会分别为字符串中的每个术语查找匹配项。
以下示例会在 guitars 集合中搜索 description 字段的值包含字符串“used by professionals”(专业人员使用)的文档。
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 }
提示
如果您的搜索字符串包含多个术语,此方法还会分别查找字符串中的每个术语的匹配项。
要了解有关 text 操作符的更多信息,请参阅 text Atlas 指南。
通配符
使用 Wildcard() 方法在搜索字符串中使用可以匹配任何字符的特殊字符来搜索文档。您可以在搜索中使用以下字符:
字符 | 说明 |
|---|---|
| 匹配任意单个字符。 |
| 匹配 0 个或更多字符。 |
| 转义字符 |
以下示例会搜索 make 字段的值包含字符串“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 行为。
要了解有关 wildcard 操作符的更多信息,请参阅 wildcard Atlas 指南。
搜索多个字段
pathMongoDB Search 操作符使用 参数来指定要搜索的字段或多个字段。要详细学习;了解path 参数可能包含的内容,请参阅“构建查询路径”指南。
注意
并非所有操作符都可以使用所有不同类型的路径。有关每个操作符支持的路径类型的详细信息,请参阅每个操作符的文档。
如要搜索多个索引字段,请使用 Multi() 方法并传入您的字段。与任何指定字段匹配的文档都包含在结果集中。
以下示例在 make 或 description 字段中搜索字符串 classic。
var result = guitarsCollection.Aggregate().Search( Builders<Guitar>.Search.Phrase(Builders<Guitar>.SearchPath .Multi(g => g.Description, g => g.Make), "classic"), indexName: "guitarmulti") .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}
对文档进行评分
MongoDB搜索查询返回的每个文档都会根据相关性分配一个分数,并且结果设立包含的文档会按从最高分到最低分的顺序返回。要学习;了解有关如何分配分数的更多信息,请参阅分数Atlas指南。
分配给返回文档的分数是文档元数据的一部分。您可以通过在聚合管道中使用 $project 阶段,将每个返回文档的分数与结果设立一起包含在内。
以下示例在 guitars集合中搜索 make字段的值恰好包含六个字母的文档,并使用 $project 阶段将名为 score 的字段添加到返回的文档。
var regex = "[A-Za-z]{6}"; var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Regex(g => g.Make, regex, allowAnalyzedField: true), indexName: "guitarscore") .Project<Guitar>(Builders<Guitar>.Projection .Include("Id") .Include("Make") .Include("Description") .MetaSearchScore(g => g.Score)) .ToList();
搜索会返回以下文档:
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 } { "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 } { "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 } { "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 }
修改MongoDB搜索行为
您可以通过传递 SearchOptions对象作为参数来修改 Search() 方法的行为。
SearchOptions 类包含以下属性:
属性 | 说明 |
|---|---|
| The options for counting the search results. Data type: SearchCountOptions Default: null |
| The options for displaying search terms in their original context. Data type: SearchHighlightOptions<TDocument> Default: null |
| The index to use for the search. Data type: stringDefault: null |
| A flag that specifies whether to perform a full document lookup on
the database or to return only stored source fields directly from
MongoDB Search. Data type: booleanDefault: false |
| A flag that specifies whether to return detailed information about the
score for each document in the results. Data type: booleanDefault: false |
| The starting point for pagination. When set, the search retrieves documents
starting immediately after the specified reference point. Data type: stringDefault: null |
| The end point for pagination. When set, the search retrieves documents
starting immediately before the specified reference point. Data type: stringDefault: null |
| The sorting criteria to apply to the results. Data type: SortDefinition<TDocument> Default: null |
| The options for tracking search terms. Data type: SearchTrackingOptions Default: null |
SearchAfter 示例
以下示例通过执行以下操作对MongoDB Search 操作的结果进行分页:
定义使用
MetaSearchSequenceToken()构建器方法的投影,该方法指定一个PaginationToken来包含参考点创建
SearchOptions实例,并设置要使用的索引和排序条件运行初始搜索以查找具有
description字段值且包含文本"classic"的文档,并将投影和选项应用于操作将同一
SearchOptions实例的SearchAfter属性设置为指示下一个搜索在基本搜索的第一个结果之后开始运行具有相同匹配条件的另一个搜索操作,并应用搜索选项对结果进行分页
var projection = Builders<Guitar>.Projection .Include(x => x.Make) .MetaSearchSequenceToken(x => x.PaginationToken); var searchDefinition = Builders<Guitar>.Search.Text(g => g.Description, "classic"); var searchOptions = new SearchOptions<Guitar> { IndexName = "default", Sort = Builders<Guitar>.Sort.Ascending(g => g.Id) }; // Runs the base search operation var baseSearchResults = guitarsCollection.Aggregate() .Search(searchDefinition, searchOptions) .Project<Guitar>(projection) .ToList(); // Sets the starting point for the next search searchOptions.SearchAfter = baseSearchResults[0].PaginationToken; var result = guitarsCollection.Aggregate() .Search(searchDefinition, searchOptions) .ToList();
此搜索将返回如下文档:
{ "_id": 2, "make": "Gibson", "description": "Classic guitars known for their rich, full tones.", "establishedYear": 1902, "in_stock": true, "rating": 8 }