【AQL】SORT操作

SORT operation in AQL

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将生效。

<think> 我们正在讨论Aerospike的AQL(Aerospike Query Language)。AQL是Aerospike自带的一个命令行工具,用于与Aerospike数据库进行交互,类似于SQL shell,但语法和功能有所不同。AQL允许用户执行数据操作(如插入、更新、删除)和查询,以及管理任务(如创建索引、查看状态等)。 根据引用[3]的内容,我们得知在AQL中删除记录或bin(字段)的方法。引用[3]提到:“is comma-separated list of bin values. Keep it NULL (case insensitive & w/o quotes) to delete the bin”。这意味着在AQL中,我们可以通过将bin的值设置为NULL来删除该bin。同时,我们也可以删除整个记录。 下面我将详细介绍AQL的删除操作: 1. **删除记录(整行)**: 使用`DELETE`语句可以删除整个记录(即主键对应的所有数据)。 语法:`DELETE FROM <namespace>.<set> WHERE PK = '<primary_key>'` 示例:删除命名空间`test`中set `demo`的主键为`key1`的记录。 ```sql DELETE FROM test.demo WHERE PK = 'key1' ``` 2. **删除指定的bin(字段)**: 使用`UPDATE`语句,并将要删除的bin设置为`NULL`。 语法:`UPDATE <namespace>.<set> SET <bin1> = NULL, <bin2> = NULL ... WHERE PK = '<primary_key>'` 示例:删除命名空间`test`中set `demo`的主键为`key1`的记录中的`bin1`和`bin2`字段。 ```sql UPDATE test.demo SET bin1 = NULL, bin2 = NULL WHERE PK = 'key1' ``` 注意: - 在AQL中,主键(PK)是必须指定的,因为Aerospike是键值存储,通过主键来定位记录。 - 如果没有指定主键,将无法执行删除操作。 - 删除bin并不会删除记录本身,记录仍然存在(可能包含其他bin)。如果要删除整个记录,必须使用`DELETE`语句。 另外,AQL还支持其他操作,如插入(INSERT)、查询(SELECT)等。但这里我们主要关注删除操作。 下面是一个完整的AQL操作示例: 1. 启动AQL命令行工具: ```bash aql ``` 2. 删除记录: ```sql DELETE FROM test.demo WHERE PK = 'key1' ``` 3. 删除bin: ```sql UPDATE test.demo SET bin1 = NULL WHERE PK = 'key2' ``` 4. 查询记录以确认删除: ```sql SELECT * FROM test.demo WHERE PK = 'key1' SELECT * FROM test.demo WHERE PK = 'key2' ``` 需要注意的是,AQL的语法与SQL类似,但并不完全兼容。Aerospike的AQL是专门为Aerospike设计的,因此在使用时需参考Aerospike官方文档。 引用[3]中提到的内容也印证了在AQL中删除bin的方式就是将bin的值设置为NULL。 希望以上信息对您有帮助。 §§相关问题§§ 1. Aerospike AQL支持哪些数据类型? 2. 如何使用AQL插入和更新数据? 3. Aerospike AQL的SELECT语句有哪些用法? 4. 在AQL中如何创建和删除二级索引? </think>### Aerospike AQL语句介绍 Aerospike AQL(Aerospike Query Language)是Aerospike自带的交互式命令行工具,用于执行数据库操作(增删改查)、管理索引和监控集群状态。其语法类似SQL,但针对Aerospike的键值模型进行了优化。以下是核心功能详解: --- #### 1. **基础删除操作** - **删除整条记录**: ```sql DELETE FROM <namespace>.<set> WHERE PK = '<primary_key>' ``` 示例:删除命名空间`test`中`users`集合的主键`user123` ```sql DELETE FROM test.users WHERE PK = 'user123' ``` - **删除特定Bin(字段)**: 通过设置Bin值为`NULL`实现删除(引用[3]): ```sql UPDATE test.users SET email = NULL WHERE PK = 'user123' ``` > 注:`NULL`需大写且不加引号,表示删除该Bin[^3]。 --- #### 2. **批量删除** - **删除集合所有数据**: ```sql DELETE FROM test.users WHERE 1 = 1 ``` ⚠️ 谨慎使用,可能触发全表扫描。 - **基于二级索引删除**(需先创建索引): ```sql CREATE INDEX idx_age ON test.users (age) -- 创建索引 DELETE FROM test.users WHERE age BETWEEN 30 AND 40 -- 按条件删除 ``` --- #### 3. **其他常用AQL操作** - **插入数据**: ```sql INSERT INTO test.users (PK, name, age) VALUES ('user456', 'Alice', 28) ``` - **查询数据**: ```sql SELECT * FROM test.users WHERE PK = 'user456' ``` - **查看集群状态**: ```sql SHOW NODES -- 显示集群节点信息 ``` --- #### 4. **注意事项** 1. **主键必填**:Aerospike所有操作必须指定主键(`PK`),不支持无主键删除。 2. **空间回收**:删除数据后,存储空间不会立即释放,需等待后台垃圾回收(GC)机制回收[^1]。 3. **事务性**:删除操作是原子性的,但批量删除不保证事务一致性。 4. **性能影响**:删除大量数据时建议分批次执行,避免阻塞集群(引用[1]的高性能设计可缓解此问题)[^1]。 > 完整AQL语法参考官方文档: > [Aerospike AQL Documentation](https://docs.aerospike.com/tools/aql) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值