对 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 } } }
选项
字段 | 类型 | 说明 | 必需? |
---|---|---|---|
| 字符串 | 结果集中的文档计数类型。值可以是以下值之一:
如果省略,则默认值为 | no |
| int | 如果 | no |
对结果进行计数
结果文档中的计数文档包含以下整数字段:
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 日左右上映的电影。查询请求结果总数。查询包括:
示例查询使用以下阶段:
搜索 | |
从文档中排除除 | |
将输出限制为 |
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 } ])
{ "_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
集合中 released
和 genres
字段有一个索引:
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "stringFacet" }, "released": { "type": "date" } } } }
示例查询使用以下阶段:
搜索 | |
将输出限制为 | |
处理 |
db.movies.aggregate([ { "$search": { "facet": { "operator": { "near": { "path": "released", "origin": ISODate("2011-09-01T00:00:00.000+00:00"), "pivot": 7776000000 } }, "facets": { "genresFacet": { "type": "string", "path": "genres" } } }, "count": { "type": "total" } } }, { "$limit": 2 }, { "$facet": { "results": [ { "$project": { "title": 1, "released": 1, "genres": 1 } } ], "meta": [ {"$replaceWith": "$$SEARCH_META"}, {"$limit": 1} ] } } ])
[ { results: [ { _id: ObjectId('573a13c3f29313caabd6b025'), genres: [ 'Drama' ], title: 'Submarino', released: ISODate('2011-09-01T00:00:00.000Z') }, { _id: ObjectId('573a13c7f29313caabd748f7'), genres: [ 'Action', 'Horror' ], title: "Devil's Playground", released: ISODate('2011-09-01T00:00:00.000Z') } ], meta: [ { count: { total: Long('20878') }, facet: { genresFacet: { buckets: [ { _id: 'Drama', count: Long('12149') }, { _id: 'Comedy', count: Long('6436') }, { _id: 'Romance', count: Long('3274') }, { _id: 'Crime', count: Long('2429') }, { _id: 'Thriller', count: Long('2400') }, { _id: 'Action', count: Long('2349') }, { _id: 'Adventure', count: Long('1876') }, { _id: 'Documentary', count: Long('1755') }, { _id: 'Horror', count: Long('1432') }, { _id: 'Biography', count: Long('1244') } ] } } } ] } ]
要了解有关结果的详细信息,请参阅计数结果。
示例
以下示例使用 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) } }
以下查询从 movies
集合中搜索 2010
到 2015
年份之间的电影。查询请求结果总数。
db.movies.aggregate([ { "$searchMeta": { "range": { "path": "year", "gte": 2010, "lte": 2015 }, "count": { "type": "total" } } } ])
Atlas Search 返回以下结果:
{ "count" : { "total" : NumberLong(5971) } }
要了解有关结果的详细信息,请参阅计数结果。