Docs 菜单
Docs 主页
/
MongoDB Atlas
/ / / /

对 Atlas Search 结果进行计数

在此页面上

  • 语法
  • 选项
  • 对结果进行计数
  • SEARCH_META 聚合变量
  • 示例

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

字符串

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

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

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

如果省略,则默认值为 lowerBound

no

threshold

int

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

no

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

选项
说明

lowerBound

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

total

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

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

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

例子

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

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

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

示例查询使用以下阶段:

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

从文档中排除除 titlereleased 之外的所有字段,并将存储在 $$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 集合中 releasedgenres 字段有一个索引:

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

示例查询使用以下阶段:

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

将输出限制为 2 份文档。

处理 $search 结果的方法是排除文档中除 titlereleasedgenres 之外的所有字段,并包含存储在 meta 数组内的 $$SEARCH_META 变量中的元数据结果。

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 集合中搜索 20102015 年份之间的电影。该查询请求对结果进行下限计数:

db.movies.aggregate([
{
"$searchMeta": {
"range": {
"path": "year",
"gte": 2010,
"lte": 2015
},
"count": {
"type": "lowerBound"
}
}
}
])

Atlas Search 返回以下结果:

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

以下查询从 movies 集合中搜索 20102015 年份之间的电影。查询请求结果总数。

db.movies.aggregate([
{
"$searchMeta": {
"range": {
"path": "year",
"gte": 2010,
"lte": 2015
},
"count": {
"type": "total"
}
}
}
])

Atlas Search 返回以下结果:

{ "count" : { "total" : NumberLong(5971) } }

要了解有关结果的详细信息,请参阅计数结果。

后退

3。突出显示搜索词