对 Atlas Search 结果进行计数
Atlas Search count
选项在元数据结果文档中添加一个字段,显示查询的搜索结果计数。您可以使用count
来确定结果集的大小。您可以在$search或$searchMeta
阶段使用它。您必须将其与操作符或收集器结合使用,以显示文档总数或与查询匹配的文档数下限。
注意
要对分片集合使用 count
选项,您的集群必须运行 MongoDB 6.0 或更高版本。在运行 MongoDB 7.2.0 版本的分片 Atlas 集群上,$searchMeta
可能会为 count
返回错误。
MongoDB 建议使用带 $searchMeta
阶段的 count
来检索仅针对该查询的元数据结果。要使用 $search
阶段来检索元数据结果和查询结果,则必须使用 $$SEARCH_META
变量。要了解详情,请参阅 SEARCH_META
聚合变量。
注意
对于在解释模式下使用count
运行的查询,Atlas Search 不会将count
结果包含在查询结果中。
语法
count
通过以下语法实现:
{ "$searchMeta"|"$search": { "index": "<index name>", // optional, defaults to "default" "<operator>": { <operator-specifications> }, "count": { "type": "lowerBound"|"total", "threshold": <number-of-documents> //optional } } }
选项
字段 | 类型 | 说明 | 必需? |
---|---|---|---|
type | 字符串 | 结果集中的文档计数类型。值可以是以下值之一:
如果省略,则默认值为 | 没有 |
threshold | int | 如果 type 为 lowerBound ,精确计数应包含的文档数。如果省略,默认为 1000 ,表示 1000 以下的任何数字都是结果中文档数的精确计数,1000 以上的任何数字都是粗略计数。 | 没有 |
对结果进行计数
结果文档中的计数文档包含以下整数字段:
SEARCH_META
聚合变量
当您使用 $search
阶段运行查询时,Atlas Search 会将元数据结果存储在 $$SEARCH_META
变量中,并且仅返回搜索结果。您可以在所有支持的聚合管道阶段使用 $$SEARCH_META
变量来查看 $search
查询的元数据结果。
只有同时需要搜索结果和元数据结果时,MongoDB 才建议使用 $$SEARCH_META
变量。否则,请使用:
$search
阶段以仅显示搜索结果。$searchMeta
阶段以仅显式元数据结果。
例子
假设 sample_mflix.movies
集合中 released
字段有一个索引:
{ "mappings": { "dynamic": false, "fields": { "released": { "type": "date" } } } }
以下查询在movies
集合中搜索 2011 年 9 月 1 日左右上映的电影。查询请求结果总数。查询包括:
$project
阶段从文档中排除除title
和released
之外的所有字段,并将存储在$$SEARCH_META
变量中的元数据结果作为名为meta
的字段的值包括在内。。$limit
阶段将输出限制为2
个文档。
db.movies.aggregate([ { "$search": { "near": { "path": "released", "origin": ISODate("2011-09-01T00:00:00.000+00:00"), "pivot": 7776000000 }, "count": { "type": "total" } } }, { "$project": { "meta": "$$SEARCH_META", "title": 1, "released": 1 } }, { "$limit": 2 } ])
Atlas Search 返回以下查询结果:
{ "_id" : ObjectId("573a13c3f29313caabd6b025"), "title" : "Submarino", "released" : ISODate("2011-09-01T00:00:00Z"), "meta" : { "count" : { "total" : NumberLong(23026) } } } { "_id" : ObjectId("573a13c7f29313caabd748f7"), "title" : "Devil's Playground", "released" : ISODate("2011-09-01T00:00:00Z"), "meta" : { "count" : { "total" : NumberLong(23026) } } }
要了解有关结果的详细信息,请参阅计数结果。
举例
以下示例使用 sample_mflix.movies
集合中的 year
字段的索引:
{ "mappings": { "dynamic": false, "fields": { "year": { "type": "number" } } } }
以下查询从 movies
集合中搜索 2010
到 2015
年份之间的电影。该查询请求对结果进行下限计数:
db.movies.aggregate([ { "$searchMeta": { "range": { "path": "year", "gte": 2010, "lte": 2015 }, "count": { "type": "lowerBound" } } } ])
Atlas Search 返回以下结果:
{ "count" : { "lowerBound" : NumberLong(1001) } }
以下查询在collection中搜索2010
和2015
movies
年份之间的电影。查询请求结果总数:
db.movies.aggregate([ { "$searchMeta": { "range": { "path": "year", "gte": 2010, "lte": 2015 }, "count": { "type": "total" } } } ])
Atlas Search 返回以下结果:
{ "count" : { "total" : NumberLong(5971) } }
要了解有关结果的详细信息,请参阅计数结果。