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基础语法要点:
- FOR循环:遍历集合或数组
- FILTER:过滤数据
- SORT:排序结果
- LIMIT:限制返回数量
- RETURN:定义返回格式
- LET:定义变量
下一步,让我们学习ArangoDB的数据类型!
最后更新:2026-03-27