MongoDB Search 允许您在索引中配置排序,以在索引时间以升序或降序预排序文档,而不是在查询时间排序。当结果集非常大时,这十分有用,因为这会导致查询时间排序变慢。您可以将 sort 索引选项与以下 MongoDB Search 字段类型一起使用:
booleandatenumber(整数、浮点数和 double 值)objectIdtokenuuid
您还可以使用 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的字段。booleandatenumber(整数、浮点数和 double 值)objectIdtoken(stringvalues)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 字段类型。
Considerations
具有
sort规格的索引可能会导致索引构建和复制速度变慢。与使用非排序索引相比,将
$search.sort指定为索引排序反向的查询可能会比较慢。使用其他$search.sort规格的查询不会受到影响。MongoDB Search 每个索引只支持一个
sort规格。如果您想对不同字段进行排序,请选择主要排序顺序作为索引排序。
示例
以下示例在 sample_airbnb.listingsAndReviews 集合中的字段上创建已排序索引。
以下索引定义按降序对 number_of_reviews 和 last_reviewed 字段进行排序。
{ "mappings": { "dynamic": false, "fields": { "number_of_reviews": { "type": "number" }, "last_reviewed": { "type": "date" } } }, "sort": { "number_of_reviews": -1, "last_reviewed": -1 } }
以下索引定义以降序排序 number_of_reviews 和 last_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字段定义为 string、autocomplete 和 token 类型。该索引仅使用 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" } } }