定义
facetfacet收集器按指定分面字段中的值或范围对结果进行分组,并返回每个组的计数。您可将
facet与$search和$searchMeta阶段一起使用。MongoDB 建议使用附带$searchMeta阶段的facet来仅检索查询的元数据结果。要使用$search阶段来检索元数据结果和查询结果,则须使用$$SEARCH_META聚合变量。请参阅SEARCH_META聚合变量 以了解详情。如果在 embeddedDocuments 字段类型定义中定义了 storedSource ,就可以使用 returnScope 和 returnStoredSource 对对象数组内的嵌套字段进行分面。否则,您只能在根 embeddedDocuments 类型字段上进行分面。关于分面的示例:
嵌套在对象数组内的字段,请参阅 returnScope 示例。
使用
embeddedDocument匹配embeddedDocuments数组的子项,请参阅 嵌入式作用域分面(Facet)示例。根
embeddedDocuments类型字段,请参阅 分面查询。
语法
facet 通过以下语法实现:
{ "$searchMeta"|"$search": { "index": <index name>, // optional, defaults to "default" "facet": { "operator": { <operator-specifications> }, "facets": { <facet-definitions> } }, "returnScope": { "path": "<embedded-documents-field-to-query>" }, "returnStoredSource": true }}字段
字段 | 类型 | 必需? | 说明 |
|---|---|---|---|
| 文档 | 是 | 用于对每个分面(Facet)的数据进行分桶的信息。您必须指定至少一个分面(Facet)定义。每个分面(Facet)定义还可以指定分面(Facet)聚合,以计算每个存储桶的指标。 |
| 文档 | no | 用于执行分面(Facet)面操作的操作符。如果省略, MongoDB搜索将对集合中的所有文档执行分面(Facet)。 |
内存要求
无论您的集群层如何,分面(Facet)查询都是内存密集型的。指定 分面(Facet)聚合 或 嵌套分面(Facet) 的查询比其他分面(Facet)查询需要更多的内存和磁盘。在生产环境中使用分面(Facet)之前,请确认您的集群有足够的内存来处理您的工作负载。要了解更多信息,请参阅 搜索内存管理。要获取工作负载的规模调整指导,请 请求支持。
分面(Facet)查询所需的内存取决于您进行分面(Facet)的字段中的独特值数,而不是您使用 numBuckets 或 boundaries 请求的桶数。示例,在具有 500 万个独特值的字段上请求 20 个桶的分面(Facet)仍然会计算每个独特值,以确定前 20 个桶。
对于 嵌套分面(Facet),查询中计算出的唯一值总数会根据每个嵌套级别的唯一值进行乘法运算。即使每个单独的字段具有较低的关联基数,嵌套路径上的值组合也可能产生大量的唯一存储桶。要了解有关嵌套分面(Facet)如何增加存储桶数量的更多信息,请参阅 嵌套分面(Facet)。
MongoDB Search 会为每个查询分别追踪分面(Facet)计数,因此总内存使用量会随着并发分面(Facet)查询的数量而扩展。在分片集群上,MongoDB Search 还需要内存来合并来自每个分片的存储桶,这会随着分片的数量和存储桶的数量而扩展。
分面定义
分面(Facet)定义文档包含分面(Facet)名称和特定于分面(Facet)类型的选项。MongoDB Search 支持以下类型的分面:
字符串分面
string 分面(Facet)允许您根据指定 string 字段中最常见的 string 值缩小 MongoDB Search 结果的范围。请注意,字符串字段必须建立索引为 token。要对嵌入式文档中的string字段进行分面(Facet),您还必须对要作为文档类型的父字段进行索引。当您在数组或嵌入式文档中对字符串进行分面(Facet)时,MongoDB Search 会根据匹配的根文档数量返回分面(Facet)计数。
语法
字符串分面采用以下语法:
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "string", "path" : "<field-path>", "numBuckets" : <number-of-categories>, "embeddedDocument": { <embedded-document-scope> } // optional } } } }}选项
选项 | 类型 | 说明 | 必需? |
|---|---|---|---|
| 对象 | 将分面(Facet)的存储桶计数范围限定为 | no |
| int | 结果中要返回的最大分面(Facet)类别数量。值必须小于或等于 | no |
| 字符串 | 用于分面的字段路径。您可将被索引字段指定为 token。 | 是 |
| 字符串 | 分面类型。值必须是 | 是 |
例子
例子
以下示例将对 sample_mflix.movies 集合使用名为 default 的索引。集合中的 genres 字段被索引为 token 类型,而 year 字段被索引为 number 类型。
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "token" }, "year": { "type": "number" } } }}该查询使用 $searchMeta 阶段在 movies 集合中的 year 字段内搜索从 2000 年到 2015 年的电影,并检索每种类型的电影数量。
db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "range": { "path": "year", "gte": 2000, "lte": 2015 } }, "facets": { "genresFacet": { "type": "string", "path": "genres" } } } } }])要了解有关这些结果的更多信息,请参阅分面结果。
数值分面
数字分面允许您将搜索结果分解为不同的数字范围,从而确定数字值在搜索结果中的频率。当您对数组或嵌入式文档中的数字进行分面(Facet)时, MongoDB Search 会根据匹配的根文档的数量返回分面(Facet)计数。
语法
数字分面采用以下语法:
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "number", "path" : "<field-path>", "boundaries" : <array-of-numbers>, "default": "<bucket-name>", "embeddedDocument": { <embedded-document-scope> } // optional } } } }}选项
选项 | 类型 | 说明 | 必需? |
|---|---|---|---|
| 数字数组 | 按升序排列的数值列表,指定存储桶的边界。您必须指定介于 2 到 10,000 个 (
| 是 |
| 字符串 | 附加存储桶的名称,用于对从操作符返回的不属于指定边界的文档进行计数。如果省略, MongoDB Search 也会包含不属于指定存储桶的分面(Facet)操作符符的结果,但不将其包含在任何存储桶计数中。 | no |
| 对象 | 将分面(Facet)的存储桶计数范围限定为 | no |
| 字符串 | 用于分面的字段路径。您可以指定一个已建立 number 类型索引的字段。 | 是 |
| 字符串 | 分面类型。值必须是 | 是 |
例子
例子
以下示例将对 sample_mflix.movies 集合使用名为 default 的索引。集合中的 year 字段被索引为 number 类型。
{ "mappings": { "dynamic": false, "fields": { "year": [ { "type": "number" } ] } }}此查询使用 $searchMeta 阶段在 movies 集合中的 year 字段中搜索 1980 到 2000 年间的影片,并检索查询的元数据结果。此查询指定了三个存储桶:
1980,包括此存储桶的下限1990、1980存储桶的不含上限以及此存储桶的包含下限2000,1990存储桶的独占上限
该查询还会指定一个名为 other 的 default 存储桶,以便检索不属于任何指定边界的查询结果。
db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "range": { "path": "year", "gte": 1980, "lte": 2000 } }, "facets": { "yearFacet": { "type": "number", "path": "year", "boundaries": [1980,1990,2000], "default": "other" } } } } }])要了解有关这些结果的更多信息,请参阅分面结果。
日期分面
日期分面允许您根据日期缩小搜索结果的范围。当您对数组或嵌入式文档中的日期进行分面(Facet)时, MongoDB Search 会根据匹配的根文档的数量返回分面(Facet)计数。
语法
日期分面采用以下语法:
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "date", "path" : "<field-path>", "boundaries" : <array-of-dates>, "default": "<bucket-name>", "embeddedDocument": { <embedded-document-scope> } // optional } } } }}选项
选项 | 类型 | 说明 | 必需? |
|---|---|---|---|
| 数字数组 | 指定每个存储桶边界的日期值列表。您必须指定:
每对相邻的值都充当存储桶的包含下限和不包含上限。 | 是 |
| 字符串 | 附加存储桶的名称,用于对从操作符返回的不属于指定边界的文档进行计数。如果省略, MongoDB Search 也会包含不属于指定存储桶的分面(Facet)操作符符的结果,但MongoDB Search 不会将这些结果包含在任何存储桶计数中。 | no |
| 对象 | 将分面(Facet)的存储桶计数范围限定为 | no |
| 字符串 | 用于分面的字段路径。您可将被索引字段指定为 date 类型。 | 是 |
| 字符串 | 分面类型。值必须是 | 是 |
例子
例子
以下示例将对 sample_mflix.movies 集合使用名为 default 的索引。集合中的 released 字段将索引为 date 类型。
{ "mappings": { "dynamic": false, "fields": { "released": [ { "type": "date" } ] } }}此查询使用 $searchMeta 阶段在 movies 集合中的 released 字段中搜索 2000 到 2015 年间的影片,并检索查询的元数据结果。此查询指定了四个存储桶:
2000-01-01,包括此存储桶的下限2005-01-01、2000-01-01存储桶的不含上限以及此存储桶的包含下限2010-01-01、2005-01-01存储桶的不含上限以及此存储桶的包含下限2015-01-01,2010-01-01存储桶的独占上限
该查询还会指定一个名为 other 的 default 存储桶,以便检索不属于任何指定边界的查询结果。
db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "range": { "path": "released", "gte": ISODate("2000-01-01T00:00:00.000Z"), "lte": ISODate("2015-01-31T00:00:00.000Z") } }, "facets": { "yearFacet": { "type": "date", "path": "released", "boundaries": [ISODate("2000-01-01"), ISODate("2005-01-01"), ISODate("2010-01-01"), ISODate("2015-01-01")], "default": "other" } } } } }])要了解有关这些结果的更多信息,请参阅分面结果。
比较分面(Facet)的字段类型
与过时的类型(stringFacet、numberFacet、dateFacet)相比,更新的MongoDB搜索字段类型改进了支持分面(Facet)的功能。下表概述了功能上的主要区别:
分面(Facet)类别 | 更新的字段类型 | 过时的分面(Facet)类型 | 主要差异 |
|---|---|---|---|
字符串 | stringFacet(已过时) | Normalizer 支持: | |
数值 | numberFacet(已过时) | 数组支持: | |
Date | dateFacet(已过时) | 数组支持: |
注意
当为同一字段定义过时和更新的字段类型时,过时的分面(Facet)类型优先。示例,如果为字段同时定义了 token 和 stringFacet,分面(Facet)计算将使用 stringFacet 映射。
对嵌入式文档数组的匹配子项进行分面(Facet)
每个分面(Facet)定义都可以包含一个可选的 embeddedDocument 字段,该字段将分面(Facet)的存储桶计数范围仅限于 embeddedDocuments 数组中与查询谓词匹配的子文档。如果省略 embeddedDocument 字段,则分面(Facet)是文档索引的。
如果没有 embeddedDocument,如果根文档有任何属于该存储桶的子文档,则该根文档会计入该存储桶,即使该子文档与 facet.operator 块中定义的查询不匹配。embeddedDocument 字段将存储桶贡献限制为仅与指定 embeddedDocument.operator 匹配的子项。它在每个存储桶中最多对每个根文档计数一次。
embeddedDocument 字段包含以下字段:
字段 | 类型 | 说明 | 必需? |
|---|---|---|---|
| 字符串 | 索引 | 是 |
| 对象 | 在 中指定的每个数组文档上运行的 操作符 | 是 |
对于 数字 或 日期 分面(Facet),如果指定了 default 存储桶,则其值超出配置的 boundaries 的匹配子项将计入该存储桶,规则与文档索引分面(Facet)相同。没有匹配子项的根文档不会计入 embeddedDocument 范围的分面(Facet),但仍可计入同一查询中的任何其他无范围分面(Facet)。
重要
您不能将 embeddedDocument 范围的分面(Facet)与其他几个分面(Facet)选项结合使用。要了解更多信息,请参阅限制。
有关示例,请参阅嵌入式作用域分面(Facet)示例。
分面(Facet)聚合
重要
分面(Facet)聚合处于预览阶段。“预览”期间,功能和相应的文档可能随时更改。要了解更多信息,请参阅预览功能。
要为每个分面(Facet)存储桶计算指标,请将 aggregations 文档添加到分面(Facet)定义中。MongoDB Search 从 MongoDB Search 索引计算指标,因此它比稍后在管道中运行 $group 阶段要高效得多。
对于每个分面(Facet)桶,aggregations 允许您计算以下值:
总和
平均值
最低
最大值
first
last
使用 aggregations 时,必须:
为每个指标在
path中指定的字段建立索引,类型为token、number或date。如果您需要存储桶计数,请明确包含
count指标。仅在嵌套分面(Facet)的叶子级别指定
aggregations。如果您想计算中间分组的指标,请将该分组指定为带有
aggregations且没有嵌套分面(Facet)的单独顶级分面(Facet)。
MongoDB Search 对 MongoDB Search 索引中的数据进行 aggregations 计算,该索引是 最终一致的。
注意
内存要求
指定 aggregations 或 嵌套分面(Facet)的分面(Facet)查询会增加 MongoDB Search 索引所需的内存和磁盘空间,超出其他分面(Facet)查询的要求。要了解更多信息,请参阅内存要求。
语法
aggregations 通过以下语法实现:
{ "$searchMeta": { "facet": { "facets": { "<facet-name>": { "type": "<facet-type>", "path": "<field-path>", "aggregations": { "<aggregation-name>": { "type": "sum" | "min" | "max" | "avg" | "first" | "last", "path": "<field-path>" } } } } } }}aggregations 文档中的每个键都是您指定的聚合名称。MongoDB Search 会在存储桶文档中以您指定的名称返回每个聚合。
选项
选项 | 类型 | 说明 | 必需? |
|---|---|---|---|
| 字符串 | 用于计算指标的字段路径(Field Path)。除 | 视条件而定 |
| 字符串 | 是 |
指标类型
类型 | 字段要求 | 说明 |
|---|---|---|
| 无 | 计算存储桶中的文档数量。请勿为此指标类型指定 |
| 将存储桶中文档的指定字段的值相加。 | |
| 返回桶中文档指定字段的平均值。如果桶中没有任何文档具有该字段的值,MongoDB Search 返回 | |
| 无 | 返回存储桶中文档指定字段的最小值。 |
| 无 | 返回存储桶中文档指定字段的最高值。 |
| 无 | 根据查询 排序 选项定义的顺序,返回存储桶中第一个文档的指定字段的值。如果查询未指定排序,则顺序是任意的。要学习如何指定排序,请参阅 排序 MongoDB Search 结果。 |
| 无 | 根据查询 sort 选项定义的顺序,返回存储桶中最后一个文档的指定字段的值。如果查询未指定排序,则顺序是任意的。要学习如何指定排序,请参阅 排序 MongoDB Search 结果。 |
重要
min 和 max 支持所有字段类型,包括 token。当 MongoDB Search 计算这些指标时,它会跳过字段解析为不支持类型的任何文档。当 MongoDB Search 跳过文档时,不会返回错误。要确定 MongoDB Search 是否跳过了存储桶中的文档,请将 count 指标添加到同一个 aggregations 文档中,并将其与您预期的文档数量进行比较。
对于 MongoDB Search 不会跳过的值,min 会选择存储桶中的最小值,而 max 会选择最大值。如果这些值并非全部属于同一类型,MongoDB Search 将应用 BSON 类型比较顺序 来确定哪个值最小或最大。
数组注意事项
每种指标类型对解析为多个值(例如数组)的字段的处理方式各不相同:
sum并avg跳过该文档。min并max选择数组中的最小值和最大值,用作文档的代表性元素。first并last将所有值作为数组返回。
对于 first 和 last,返回的数组与源文档的区别如下:
值的顺序可能会有所不同。MongoDB Search 从索引中读取值,这不会保留源文档的顺序。例如,如果文档包含
["red", "blue", "green"],MongoDB Search 可能会返回["blue", "green", "red"]。MongoDB Search 仅返回重复值的一个实例。
MongoDB Search 会返回路径中的每个值,包括无法进行分面(Facet)的类型的值。示例,如果一个数组同时包含字符串和布尔值,MongoDB Search 会将布尔值与字符串一起返回。
要返回与源文档中完全一致的值,请在索引定义中为该字段定义 storedSource,并在查询中将 returnStoredSource 设置为 true。
嵌套分面(Facet)
重要
嵌套分面(Facet)目前处于预览阶段。“预览”期间,功能和相应的文档可能随时更改。要了解更多信息,请参阅预览功能。
要按其他字段对每个存储桶中的文档进行分组,请将 facets 文档添加到现有的分面(Facet)定义中。每个嵌套分面(Facet)定义使用与顶级分面(Facet)定义相同的语法,因此您可以嵌套分面(Facet)来构建分组树。MongoDB Search 会在父分面(Facet)的每个存储桶内返回嵌套分面(Facet)的存储桶。
对于包含嵌套分面(Facet)的每个分面(Facet)存储桶,MongoDB Search 还会返回一个 count 字段,其中包含存储桶中的文档数量。您无需为这些中间存储桶指定 count 指标。
您可以嵌套分面(Facet),层数不限。但是,以下限制应用:
您只能在嵌套分面(Facet)树的叶分面(Facet)上指定
aggregations。指定了facets的分面(Facet)定义不能同时指定aggregations。要计算中间分组的指标,请将该分组指定为带有aggregations且没有嵌套分面(Facet)的单独顶级分面(Facet)。不能将嵌套分面(Facet)命名为
count。MongoDB Search 为中间存储桶的文档计数保留count。一个查询可以返回的唯一分面(Facet)桶的总数不能超过
100000。要计算一个分面(Facet)树生成的存储桶,请将其嵌套分支每一层的存储桶数量相乘。对于 string 分面(Facet),某一层级的存储桶数量为numBuckets,或者对于数字或日期分面(Facet),则为boundaries和default定义的存储桶数量。示例,一个请求20个桶的分面(Facet)包含一个请求20个桶的嵌套分面(Facet),会产生400个唯一桶。因为每一层都会乘以这个总数,所以在每一层请求更多的存储桶会减少您可以嵌套的层数。
分面结果
对于分面(Facet)查询, MongoDB Search 返回定义的分面(Facet)名称到结果中该分面(Facet)的存储桶大量的映射。分面(Facet)结果文档包含 buckets 选项,它是分面(Facet)结果存储桶的大量。大量中的每个分面(Facet)存储桶文档都包含以下字段:
选项 | 类型 | 说明 |
|---|---|---|
| 对象 | 标识此方面存储桶的唯一标识符。此值与正在分面的数据类型相匹配。 |
| int | 此分面(Facet)存储桶中的文档计数。要学习;了解有关 |
如果分面(Facet)定义指定了 分面(Facet)聚合,则每个存储桶文档都包含您在 aggregations 文档中指定的指标,而不是 count 字段。如果分面(Facet)定义指定了 嵌套分面(Facet),则每个存储桶文档都包含一个 count 字段,其中包含存储桶中的文档数量以及嵌套分面(Facet)的结果。
多选分面
MongoDB Search 允许您同时查看和选择同一分面(Facet)中的多个存储桶。通常,选择分面(Facet)中的存储桶会根据该选择筛选搜索结果,并更改所有分面的计数。
例子
假设 sample_airbnb.listings集合的索引定义指定了以下字段的分面:
cancellation_policyroom_typeaccommodates
cancellation_policy分面(Facet)具有以下存储桶:
flexiblemoderatestrict_14_with_grace_periodsuper_strict_30super_strict_60
每个桶都有自己的结果计数。当搜索 moderate cancellation_policy 时,其他四个桶的计数变为 0。此外,room_type 和 accommodates 分面(Facet)中存储桶的计数减少为每个存储桶中也具有 flexible cancellation_policy 的结果数量。
如果您需要更精细地控制分面如何影响搜索结果计数,请在分面查询中启用doesNotAffect属性启用多选分面。这些分面仍会过滤结果,但查询不会更改其结果计数。
您可以在以下操作符中指定 doesNotAffect:
要排除多个分面(Facet),请指定一个分面(Facet)名称数组。大多数使用案例仅排除与过滤器共享路径的分面(Facet)。示例,rating 字段上的 equals 过滤器指定了使用 rating 作为其路径的分面(Facet)的名称。
例子
考虑对 sample_airbnb.listingsAndReviews 集合的查询,查找包含 moderate cancellation_policy 的文档。如果您指定 doesNotAffect 值为 cancellation_policy,则 cancellation_policy 分面(Facet)中存储桶的计数不会改变,但其他分面(Facet)的存储桶结果计数将减少为每个存储桶中也具有 moderate cancellation_policy 的结果数量。
有关更多信息,请参阅多选分面(Facet)示例。
您不能将 doesNotAffect 与 embeddedDocument 范围的分面(Facet)结合使用。要了解更多信息,请参阅 对嵌入式文档数组的匹配子项进行分面(Facet)。
最后,对于具有多个分面的使用案例,您可以限制影响给定分面的其他过滤器。您可以通过在任何过滤器的 doesNotAffect 属性中指定任何分面(Facet)(包括其他字段上的分面(Facet))来实现此目的。这使您能够一眼看出哪些选择会更快或更慢地缩小选项范围。
例子
考虑对 sample_airbnb.listingsAndReviews 集合的查询,查找 accommodates 值为 3 的文档。如果您指定 doesNotAffect 值为 cancellation_policy,则 room_type 存储桶的结果计数会减少到每个存储桶中同样容纳 3 人的结果数量,但 cancellation_policy 中存储桶的结果计数不受影响。
更多信息,请参阅跨分面过滤器排除示例。
SEARCH_META 聚合变量
当您使用 $search 阶段运行查询时,MongoDB Search 会将元数据结果存储在 $$SEARCH_META 变量中,并且仅返回搜索结果。您可以在所有支持的聚合管道阶段使用 $$SEARCH_META 变量来查看 $search 查询的元数据结果。您还可以将 $$SEARCH_META 变量与 分面(Facet).聚合. 一起使用
只有同时需要搜索结果和元数据结果时,MongoDB 才建议使用 $$SEARCH_META 变量。否则,请使用:
$search阶段以仅显示搜索结果。$searchMeta阶段以仅显式元数据结果。
限制
只能对单个字段运行分面查询。无法对字段群组运行分面查询。
嵌入式范围分面(Facet)的限制
以下限制适用于 分面(Facet)匹配嵌入式文档数组中的子文档:
您不能在同一个查询中将顶级
returnScope选项与embeddedDocument范围的分面(Facet)结合使用。embeddedDocument范围分面(Facet)仅返回计数。您不能在同一个查询中将侧向钻取分面(Facet)(
doesNotAffect)与embeddedDocument范围的分面(Facet)结合使用。
分面(Facet)聚合的限制
以下限制适用于 分面(Facet)聚合:
不能将以下选项与
aggregations一起使用:doesNotAffect用于 多选分面(Facet)
您无法对以下 BSON types 进行分面(Facet)或计算聚合:
binDatabooldecimalnullobjectIdtimestamp
要对其中一种类型计算指标,请使用 视图 在索引字段之前将其转换为受支持的类型。
示例
以下示例使用示例数据。元数据结果示例演示如何使用 $searchMeta 运行 facet 查询,以便仅检索结果中的元数据。元数据和搜索结果示例演示了如何使用$search facet和$SEARCH_META 聚合变量运行 查询,以便检索搜索结果和元数据结果。returnScope 示例演示了如何在使用 embeddedDocuments 类型动态索引的对象数组中对嵌套字段进行分面(Facet)。嵌入式范围分面(Facet)示例演示了如何仅对 embeddedDocuments 数组的匹配子项进行分面(Facet)。多选和分面(Facet)间过滤器排除示例演示了如何使用 doesNotAffect 来控制分面(Facet)如何相互影响计数。聚合示例演示了如何计算每个分面(Facet)存储桶的指标,嵌套分面(Facet)示例演示了如何按第二个字段对结果进行分组并计算每个存储桶的指标。
继续学习
要学习;了解更多信息,请参阅如何在MongoDB Search 中使用分面。
facet您可以通过我们的课程和视频,学习;了解有关MongoDB搜索中的 ( MongoDB搜索操作符)的更多信息。
通过课程学习
要学习;了解有关在MongoDB Search 中使用分面的更多信息,请学习MongoDB University的MongoDB简介课程的 9 单元。1.5 小时单元包括MongoDB Search 概述以及有关创建MongoDB Search 索引、使用复合运算符运行$search 查询以及使用 facet 对结果进行分组的课程。
通过观看学习
观看此视频,了解如何在查询中创建和使用数字和 string facet (MongoDB 搜索操作符),对结果进行分组并检索分组中的结果计数。
时长:11 分钟