AQL基础语法 #

一、AQL概述 #

AQL(ArangoDB Query Language)是ArangoDB的查询语言,类似于SQL但更适合文档和图数据模型。

1.1 AQL特点 #

特点 说明
声明式 描述要什么,而不是怎么做
类型安全 自动类型检查和转换
多模型 统一操作文档、图、键值
可组合 查询可以嵌套和组合

1.2 与SQL对比 #

SQL AQL
SELECT RETURN
FROM FOR … IN
WHERE FILTER
ORDER BY SORT
LIMIT LIMIT
JOIN FOR … IN …

二、基本查询结构 #

2.1 最简单的查询 #

aql
RETURN "Hello, ArangoDB!"

输出:

json
"Hello, ArangoDB!"

2.2 FOR循环 #

aql
FOR doc IN users
    RETURN doc

2.3 完整查询结构 #

aql
FOR doc IN collection
    FILTER condition
    SORT field ASC|DESC
    LIMIT offset, count
    RETURN projection

三、FOR循环 #

3.1 遍历集合 #

aql
FOR user IN users
    RETURN user

3.2 遍历数组 #

aql
FOR i IN [1, 2, 3, 4, 5]
    RETURN i * 2

输出:

json
[2, 4, 6, 8, 10]

3.3 遍历范围 #

aql
FOR i IN 1..5
    RETURN i

输出:

json
[1, 2, 3, 4, 5]

3.4 嵌套循环 #

aql
FOR user IN users
    FOR order IN orders
        FILTER order.userId == user._key
        RETURN {
            user: user.name,
            order: order.id
        }

四、FILTER过滤 #

4.1 基本过滤 #

aql
FOR user IN users
    FILTER user.age > 25
    RETURN user

4.2 多条件过滤 #

aql
FOR user IN users
    FILTER user.age > 25 AND user.city == "北京"
    RETURN user

4.3 OR条件 #

aql
FOR user IN users
    FILTER user.city == "北京" OR user.city == "上海"
    RETURN user

4.4 IN操作符 #

aql
FOR user IN users
    FILTER user.city IN ["北京", "上海", "广州"]
    RETURN user

4.5 NOT IN操作符 #

aql
FOR user IN users
    FILTER user.city NOT IN ["北京", "上海"]
    RETURN user

4.6 范围过滤 #

aql
FOR user IN users
    FILTER user.age >= 20 AND user.age <= 30
    RETURN user

简写形式:

aql
FOR user IN users
    FILTER 20 <= user.age <= 30
    RETURN user

4.7 正则表达式 #

aql
FOR user IN users
    FILTER user.email =~ "^[a-z]+@[a-z]+\\.[a-z]+$"
    RETURN user

五、SORT排序 #

5.1 升序排序 #

aql
FOR user IN users
    SORT user.age ASC
    RETURN user

5.2 降序排序 #

aql
FOR user IN users
    SORT user.age DESC
    RETURN user

5.3 多字段排序 #

aql
FOR user IN users
    SORT user.city ASC, user.age DESC
    RETURN user

5.4 默认排序 #

aql
FOR user IN users
    SORT user.name
    RETURN user

六、LIMIT限制 #

6.1 限制数量 #

aql
FOR user IN users
    LIMIT 10
    RETURN user

6.2 分页查询 #

aql
FOR user IN users
    LIMIT 10, 20
    RETURN user

等价于:

aql
FOR user IN users
    LIMIT @offset, @count
    RETURN user

6.3 分页示例 #

aql
LET pageSize = 10
LET page = 2
FOR user IN users
    LIMIT (page - 1) * pageSize, pageSize
    RETURN user

七、RETURN返回 #

7.1 返回整个文档 #

aql
FOR user IN users
    RETURN user

7.2 返回特定字段 #

aql
FOR user IN users
    RETURN user.name

7.3 返回对象 #

aql
FOR user IN users
    RETURN {
        name: user.name,
        email: user.email
    }

7.4 重命名字段 #

aql
FOR user IN users
    RETURN {
        userName: user.name,
        userEmail: user.email
    }

7.5 返回嵌套对象 #

aql
FOR user IN users
    RETURN {
        name: user.name,
        address: {
            city: user.address.city,
            street: user.address.street
        }
    }

7.6 DISTINCT去重 #

aql
FOR user IN users
    RETURN DISTINCT user.city

八、LET变量 #

8.1 定义变量 #

aql
LET name = "ArangoDB"
RETURN name

8.2 定义数组变量 #

aql
LET cities = ["北京", "上海", "广州"]
FOR city IN cities
    RETURN city

8.3 定义查询结果变量 #

aql
LET activeUsers = (
    FOR user IN users
        FILTER user.status == "active"
        RETURN user
)
FOR user IN activeUsers
    RETURN user.name

8.4 复杂查询示例 #

aql
LET threshold = 25
LET cities = ["北京", "上海"]
FOR user IN users
    FILTER user.age > threshold AND user.city IN cities
    RETURN {
        name: user.name,
        age: user.age,
        city: user.city
    }

九、操作符 #

9.1 比较操作符 #

操作符 说明 示例
== 等于 a == b
!= 不等于 a != b
< 小于 a < b
<= 小于等于 a <= b
> 大于 a > b
>= 大于等于 a >= b
IN 在列表中 a IN [1,2,3]
NOT IN 不在列表中 a NOT IN [1,2,3]

9.2 逻辑操作符 #

操作符 说明 示例
AND 逻辑与 a AND b
OR 逻辑或 a OR b
NOT 逻辑非 NOT a

9.3 算术操作符 #

操作符 说明 示例
+ 加法 a + b
- 减法 a - b
* 乘法 a * b
/ 除法 a / b
% 取模 a % b

9.4 三元操作符 #

aql
FOR user IN users
    RETURN {
        name: user.name,
        status: user.age >= 18 ? "成年" : "未成年"
    }

十、常用函数 #

10.1 字符串函数 #

aql
FOR user IN users
    RETURN {
        upper: UPPER(user.name),
        lower: LOWER(user.name),
        length: LENGTH(user.name),
        concat: CONCAT(user.firstName, " ", user.lastName),
        substring: SUBSTRING(user.name, 0, 3)
    }

10.2 数值函数 #

aql
FOR user IN users
    RETURN {
        round: ROUND(user.score, 2),
        floor: FLOOR(user.score),
        ceil: CEIL(user.score),
        abs: ABS(user.balance)
    }

10.3 数组函数 #

aql
FOR user IN users
    RETURN {
        length: LENGTH(user.hobbies),
        first: FIRST(user.hobbies),
        last: LAST(user.hobbies),
        has: "阅读" IN user.hobbies
    }

10.4 日期函数 #

aql
FOR user IN users
    RETURN {
        year: DATE_YEAR(user.created_at),
        month: DATE_MONTH(user.created_at),
        day: DATE_DAY(user.created_at),
        formatted: DATE_FORMAT(user.created_at, "%Y-%m-%d")
    }

10.5 类型检查函数 #

aql
FOR user IN users
    RETURN {
        isString: IS_STRING(user.name),
        isNumber: IS_NUMBER(user.age),
        isArray: IS_ARRAY(user.hobbies),
        isObject: IS_OBJECT(user.address),
        isNull: IS_NULL(user.deleted_at)
    }

十一、注释 #

11.1 单行注释 #

aql
FOR user IN users
    RETURN user.name

11.2 多行注释 #

aql
FOR user IN users
    FILTER user.age > 25
    RETURN user

十二、参数化查询 #

12.1 使用绑定参数 #

aql
FOR user IN users
    FILTER user.age > @minAge AND user.city == @city
    RETURN user

JavaScript调用:

javascript
db._query(query, { minAge: 25, city: "北京" });

12.2 集合名参数化 #

aql
FOR doc IN @@collection
    RETURN doc
javascript
db._query(query, { "@collection": "users" });

十三、总结 #

AQL基础语法要点:

  1. FOR循环:遍历集合或数组
  2. FILTER:过滤数据
  3. SORT:排序结果
  4. LIMIT:限制返回数量
  5. RETURN:定义返回格式
  6. LET:定义变量

下一步,让我们学习ArangoDB的数据类型!

最后更新:2026-03-27