SORT操作
SORT操作允许您指定一个或多个排序标准和方向来控制查询结果或数组元素的顺序。
语法
一般语法为
SORT expression direction
使用
SORT操作将已经产生的中间结果排序。例如,以下查询先按lastName(升序)排序,然后按firstName(升序)排序,最后按id(降序)排序:
FOR u IN users
SORT u.lastName, u.firstName, u.id DESC
RETURN u
指定方向是可选的。默认的排序方式是升序。要显式指定排序方向,关键字ASC(升序)和DESC(降序)可以使用。多个排序标准可以使用逗号分隔。在这种情况下,每个表达式的排序方向是单独指定的。
以下示例首先按lastName升序对文档进行排序,然后按firstName升序进行排序。
SORT doc.lastName, doc.firstName
以下示例首先按lastName降序对文档进行排序,然后按firstName升序进行排序。
SORT doc.lastName DESC, doc.firstName
以下示例首先按lastName升序对文档进行排序,然后按firstName降序进行排序。
SORT doc.lastName, doc.firstName DESC
当遍历一个集合时,除非使用SORT操作显式定义排序顺序,否则文档的顺序是不确定的。
如果排序的值不是唯一的,那么其对应的文档顺序是不确定的。如果应用有一个首选的属性来确定有相同值的文档的顺序,则使用该属性。如果没有这样的属性,可以使用_id系统属性来实现稳定的排序,因为它在每个文档中时唯一的。
FOR u IN users
SORT u.firstName, u._id // break name ties with the document ID
RETURN u
使用常量 SORT表达式可以指示没有特定的排序顺序。
SORT null
在优化过程中,AQL 优化器会优化常量 SORT 表达式,但如果优化器不需要考虑任何特定的排序顺序,则明确指定它们可能会实现进一步的优化。特别是在 COLLECT 语句之后,该语句应该产生一个排序结果。在 COLLECT 语句之后指定额外的 SORT null,允许 AQL 优化器完全删除收集结果的排序后处理。另请参阅COLLECT 选项方法。
在执行一系列 SORT 操作时,最后一个总是被执行的,除非之前的 SORT 表达式更准确。如果在查询执行过程中优化规则 remove-redundant-sorts 和 remove-redundant-sorts-2 被禁用,那么最后一个 SORT 总是获胜的,尽管准确性较低。例如,考虑以下具有多个连续 SORT 操作的查询:
FOR friend IN friends
SORT friend.friend.name, friend.id, friend.age
SORT friend.age, friend.id
SORT friend.age
RETURN friend
如果上述优化规则被停用,则最后一个SORT将生效,并且集合将按friend.age进行排序。如果优化规则处于活动状态,则第二个SORT将生效,因为它涵盖了相同的friend.age属性,并且在出现平局的情况下还会按另一个属性进行排序,使其更加准确。但是,如果第二个SORT表达式中的属性顺序相反,如SORT friend.id, friend.age,则最后一个SORT将生效。