Docs 菜单
Docs 主页
/ /

$search

$search

$search 阶段对指定的字段或多个字段执行全文搜索。字段或多个字段必须由MongoDB Search 索引覆盖。

$search 管道阶段采用以下原型形式:

{
$search: {
"index": "<index-name>",
"<operator-name>"|"<collector-name>": {
<operator-specification>|<collector-specification>
},
"highlight": {
<highlight-options>
},
"concurrent": true | false,
"count": {
<count-options>
},
"searchAfter"|"searchBefore": "<encoded-token>",
"scoreDetails": true| false,
"sort": {
<fields-to-sort>: 1 | -1
},
"returnScope": {
"path": "<embedded-documents-field-to-retrieve>"
}
"returnStoredSource": true | false,
"tracking": {
<tracking-option>
}
}
}

$search 阶段采用包含以下字段的文档:

字段
类型
必要性
说明

<collector-name>

对象

可选的

用于查询的收集器名称。您可以提供一个包含收集器特定选项的文档作为该字段的值。必须提供此项或 <operator-name>

concurrent

布尔

Optional

专用搜索节点上并行搜索各分段。如果集群上没有单独的搜索节点, MongoDB Search 会忽略此标志。如果省略,则默认为 false。要学习;了解更多信息,请参阅跨分段并行查询执行。

count

对象

Optional

指定用于检索结果计数的计数选项的文档。要学习;了解更多信息,请参阅对MongoDB搜索结果进行计数。

highlight

对象

Optional

指定在原始上下文中显示搜索词的高亮选项的文档。

index

字符串

Optional

要使用的MongoDB Search索引的名称。如果省略,则默认为 default

如果将索引命名为 default,则在使用 $search 管道阶段时无需指定 index 参数。如果您为索引指定了自定义名称,则必须在 index 参数中指定此名称。

如果索引名称拼写错误或者指定的索引在集群上尚不存在,则MongoDB Search 不会返回结果。

<operator-name>

对象

可选的

搜索使用的操作符名称。您可以提供一个包含操作符特定选项的文档作为该字段的值。必须提供此项或 <collector-name>。使用 compound 操作符可运行包含多个操作符的复合查询。

returnScope

对象

Optional

将查询上下文设置为指定的嵌入式文档字段的对象。您还必须指定returnStoredSource并将其设置为true

returnStoredSource

布尔

可选的

标志,指定是对后端数据库执行完整文档查找,还是直接从 MongoDB Search 仅返回存储的源字段。如果省略,则默认值为 false。如果指定 returnScope,则必须为true

要了解详情,请参阅返回已存储源字段

searchAfter

字符串

Optional

用于检索结果的参考点。searchAfter 返回紧随指定参考点之后开始的文档。参考点必须是由 $meta 关键字 searchSequenceToken 生成的 Base64 编码令牌。如要了解详情,请参阅对结果进行分页。此字段与 searchBefore 字段互斥。

searchBefore

字符串

Optional

用于检索结果的参考点。searchBefore 返回在指定参考点之前开始的文档。参考点必须是由 $meta 关键字 searchSequenceToken 生成的 Base64 编码令牌。要了解详情,请参阅分页结果。此字段与 searchAfter 字段互斥。

scoreDetails

布尔

Optional

标志,指定是否检索结果中文档得分的明细。如果省略,则默认值为 false。要查看详情,必须在 $project 阶段中使用 $meta 表达式。要了解更多信息,请参阅返回得分详情。

sort

对象

Optional

文档,指定按升序或降序对MongoDB搜索结果进行排序的字段。您可以按日期、数字(整数、浮点数和双精度值)和字符串值进行排序。 要学习;了解更多信息,请参阅对MongoDB搜索结果进行排序。

tracking

对象

Optional

指定用于检索搜索词相关分析信息的跟踪选项的文档。

警告:此功能现已弃用。官方技术支持将于 2025 年 5 月正式终止并全面停止服务。因此,Atlas 将于该日期起停止收集用于 Atlas UI 展示的查询数据,且相关功能的用户界面将被删除。如果您有任何问题或需要进一步帮助,请联系支持或客户经理。

$search 必须是其所在的任何管道中的第一阶段。$search 不能用于以下场合中:

  • 视图定义

  • $facet 管道阶段

$search 仅返回查询结果。$search 查询的元数据结果保存在 $$SEARCH_META 聚合变量中。您可以使用 $$SEARCH_META 变量查看 $search 查询的元数据结果。

$$SEARCH_META聚合变量可在任何管道中$search阶段之后的任何位置使用,但不能在任何管道中$lookup$unionWith阶段之后使用。$$SEARCH_META聚合变量不能在$searchMeta阶段之后的任何后续阶段中使用。

例子

假设 sample_mflix.movies 集合上有如下索引。

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

以下查询使用 $search 阶段搜索在 2011 年 9 月 01 日前后上映的电影。查询包括:

  • $project 阶段,用来排除文档中除 titlereleased 之外的所有字段。

  • $facet 阶段,将输出:

    • docs 字段,其中包含由前 5 项搜索结果组成的数组

    • meta 值为$$SEARCH_META变量的字段

db.movies.aggregate([
{
"$search": {
"near": {
"path": "released",
"origin": ISODate("2011-09-01T00:00:00.000+00:00"),
"pivot": 7776000000
}
}
},
{
$project: {
"_id": 0,
"title": 1,
"released": 1
}
},
{ "$limit": 5 },
{
"$facet": {
"docs": [],
"meta": [
{"$replaceWith": "$$SEARCH_META"},
{"$limit": 1}
]
}
}
])
{
"docs" : [
{
"title" : "Submarino",
"released" : ISODate("2011-09-01T00:00:00Z")
},
{
"title" : "Devil's Playground",
"released" : ISODate("2011-09-01T00:00:00Z")
},
{
"title" : "Bag It",
"released" : ISODate("2011-09-01T00:00:00Z")
},
{
"title" : "Dos",
"released" : ISODate("2011-09-01T00:00:00Z")
},
{
"title" : "We Were Here",
"released" : ISODate("2011-09-01T00:00:00Z")
}
],
"meta" : [
{ "count" : { "lowerBound" : NumberLong(17373) } }
]
}

要了解有关 $$SEARCH_META 变量及其用法的更多信息,请参阅:

如果您在使用MongoDB Search $search 查询时遇到问题,请参阅查询故障排除。

后退

管道阶段

在此页面上