对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

对MongoDB搜索结果进行计数

MongoDB搜索 count 选项在元数据结果文档中添加一个字段,显示查询的搜索结果计数。您可以使用 count 来确定结果设立的大小。您可以在 $search 或 $searchMeta 阶段使用它。您必须将其与操作符或收集器结合使用,以显示文档总数或与查询匹配的文档数下限。

MongoDB 建议使用带 $searchMeta 阶段的 count 来检索仅针对该查询的元数据结果。要使用 $search 阶段来检索元数据结果和查询结果,则必须使用 $$SEARCH_META 变量。要了解详情,请参阅 SEARCH_META 聚合变量。

要对分片的集合使用 count 选项,您的集群必须运行MongoDB 7.0 或更高版本。在运行MongoDB 7.2.0 的分片的片集群上,$searchMeta 可能会为 count 返回错误。

对于在 解释 模式下使用 count 运行的查询, MongoDB 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

字符串

结果集中的文档计数类型。值可以是以下值之一:

  • lowerBound - 用于计算与查询匹配的文档数量的下限。您可以设置下限数字的 threshold 。

  • total - 用于对与查询匹配的文档数量进行精确计数。如果结果设立很大, MongoDB Search 可能需要比 lowerBound 更长的时间才能返回计数。

如果省略,则默认值为 lowerBound。

no

threshold

int

如果 type 为 lowerBound,精确计数应包含的文档数。如果省略,默认为 1000,表示 1000 以下的任何数字都是结果中文档数的精确计数,1000 以上的任何数字都是粗略计数。

no

结果文档中的计数文档包含以下整数字段:

选项
说明

lowerBound

该结果集的下限。如果省略 type 选项并显式请求 lowerBound 类型的计数,则默认返回此值。

total

该结果集的总计数。仅当请求类型为 total 的数时才会返回此值。

当您使用 $search 阶段运行查询时,MongoDB Search 会将元数据结果存储在 $$SEARCH_META 变量中,并且仅返回搜索结果。您可以在所有支持的聚合管道阶段使用 $$SEARCH_META 变量来查看 $search 查询的元数据结果。您还可以将 $$SEARCH_META 变量与 分面(Facet).聚合 一起使用。

只有同时需要搜索结果和元数据结果时,MongoDB 才建议使用 $$SEARCH_META 变量。否则,请使用:

  • $search 阶段以仅显示搜索结果。

  • $searchMeta 阶段以仅显式元数据结果。

例子

假设 sample_mflix.movies 集合中 released 字段有一个索引:

{ "mappings": { "dynamic": false, "fields": { "released": { "type": "date" } } }}

以下查询在movies集合中搜索 2011 年 9 月 1 日左右上映的电影。查询请求结果总数。查询包括:

示例查询使用以下阶段:

搜索 movies 集合中 2011 年 9 月 01 日前后上映的电影。该查询请求提供结果总计数和 genres 字段的元数据。

从文档中排除除 title 和 released 之外的所有字段,并将存储在 $$SEARCH_META 变量中的元数据结果作为名为 meta 的字段的值包括在内。

将输出限制为 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 }])
{ "_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" } } }])

MongoDB Search 返回以下结果:

{ "count" : { "lowerBound" : NumberLong(1001) } }