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

已排序索引

MongoDB Search 允许您在索引中配置排序,以在索引时间以升序或降序预排序文档,而不是在查询时间排序。当结果集非常大时,这十分有用,因为这会导致查询时间排序变慢。您可以将 sort 索引选项与以下 MongoDB Search 字段类型一起使用:

  • boolean

  • date

  • number (整数、浮点数和 double 值)

  • objectId

  • token

  • uuid

您还可以使用 noData 选项配置 null 或缺失值的排序方式。

sort 选项的语法如下:

1{
2 "mappings": {
3 "dynamic": true|false,
4 "fields": {
5 "<field-name>": {
6 "type": "boolean" | "date" | "number" | "objectId" | "token" | "uuid"
7 }
8 }
9 },
10 "sort": { "<field-to-sort>": 1 | -1 } | { "<field-to-sort>": { "order": 1 | -1, "noData": "lowest" | "highest" } }
11}

要使用排序索引,您必须:

  • 使用静态映射配置用于 sort 的字段。

    • boolean

    • date

    • number (整数、浮点数和 double 值)

    • objectId

    • token (string values)

    • uuid

    MongoDB Search 支持将您索引的字段作为 sort 的多种类型,前提是至少有一种类型是上面列出的支持类型之一。

  • 要对嵌套字段进行排序,请将所有中间字段配置为 document 类型,直到根字段。

注意

如果您为使用动态映射或 typeSet 索引的字段指定 sort 选项,则索引构建将失败。

已排序索引在索引构建过程中使用配置的顶级排序对 MongoDB Search 文档进行物理排序,而不是在查询时进行排序。这改善了 $search.sort 规格与索引排序或其前缀匹配的查询的性能,尤其是在对非常大的结果集(例如,结果中的文档超过 100 万份)进行排序时。

使用explain输出来验证查询是否使用索引排序。受益于索引排序的查询包括字段 usesIndexSort: true。当查询的排序字段与索引排序或索引排序的前缀匹配时,查询受益。

注意

您无法将 searchScore 元表达式用作已排序索引的一部分,因为分数仅在查询时计算。

您可以对数组字段进行排序。MongoDB Search 会将数组展平,并使用一个代表值进行比较。升序排序使用数组中的最小值,降序排序使用数组中的最大值。

对于混合类型数组,排序顺序基于 MongoDB BSON 比较顺序。对于升序排序, MongoDB Search 使用BSON类型最低的元素。对于降序排序, MongoDB Search 使用具有最高BSON类型的元素。

仅当所有父文档都静态定义为 document 类型时,才能对子字段进行排序。

使用 returnScope 的查询无法从已排序索引中获益,因为已排序索引定义不支持索引中用于排序的 embeddedDocuments 字段类型。

  • 具有 sort 规格的索引可能会导致索引构建和复制速度变慢。

  • 与使用非排序索引相比,将 $search.sort 指定为索引排序反向的查询可能会比较慢。使用其他 $search.sort 规格的查询不会受到影响。

  • MongoDB Search 每个索引只支持一个 sort 规格。如果您想对不同字段进行排序,请选择主要排序顺序作为索引排序。

以下示例在 sample_airbnb.listingsAndReviews 集合中的字段上创建已排序索引。

以下索引定义按降序对 number_of_reviewslast_reviewed 字段进行排序。

{
"mappings": {
"dynamic": false,
"fields": {
"number_of_reviews": {
"type": "number"
},
"last_reviewed": {
"type": "date"
}
}
},
"sort": { "number_of_reviews": -1, "last_reviewed": -1 }
}

以下索引定义以降序排序 number_of_reviewslast_reviewed 字段。它将具有空值或缺失值的文档放在结果的底部。

{
"mappings": {
"dynamic": false,
"fields": {
"number_of_reviews": {
"type": "number"
},
"last_reviewed": {
"type": "date"
}
}
},
"sort": {
"number_of_reviews": { "order": -1, "noData": "lowest" },
"last_reviewed": { "order": -1, "noData": "lowest" }
}
}

以下索引定义以降序排序对 date 字段进行排序。要对 date 字段进行排序,它将 reviews 字段定义为 embeddedDocuments 类型和 document 类型。

{
"mappings": {
"dynamic": false,
"fields": {
"reviews": [
{
"type": "embeddedDocuments",
"dynamic": true
},
{
"type": "document",
"dynamic": false,
"fields": {
"date": {
"type": "date"
}
}
}
]
}
},
"sort": { "reviews.date": -1 }
}

以下索引定义按升序对 property_type字段进行排序,空值和缺失值出现在结果的底部。property_type字段定义为 stringautocompletetoken 类型。该索引仅使用 token 类型进行排序。

{
"mappings": {
"dynamic": false,
"fields": {
"property_type": [
{
"type": "string"
},
{
"type": "autocomplete",
"tokenization": "edgeGram",
"minGrams": 2,
"maxGrams": 15
},
{
"type": "token"
}
]
}
},
"sort": { "property_type": { "order": 1, "noData": "highest" } }
}