ArangoDB
数组运算符
- 数组扩展
- 为了轻松地从数组中的所有元素访问命名属性,AQL [*]为数组变量扩展提供了快捷运算符。
- 使用[ * ] 带有数组变量的运算符将遍历数组中的所有元素,从而允许访问每个元素的特定属性。要求扩展变量是一个数组。 [ * ] 运算符的结果又是一个数组。
- 案例一:
为了演示阵列扩展运算符,让我们继续使用以下三个示例用户文档:
[
{
"name": "john",
"age": 35,
"friends": [
{ "name": "tina", "age": 43 },
{ "name": "helga", "age": 52 },
{ "name": "alfred", "age": 34 }
]
},
{
"name": "yves",
"age": 24,
"friends": [
{ "name": "sergei", "age": 27 },
{ "name": "tiffany", "age": 25 }
]
},
{
"name": "sandra",
"age": 40,
"friends": [
{ "name": "bob", "age": 32 },
{ "name": "elena", "age": 48 }
]
}
]
通过[*]操作符,可以轻松查询每个用户的朋友姓名:
FOR u IN users
RETURN { name: u.name, friends: u.friends[*].name }
这将产生:
[
{ "name" : "john", "friends" : [ "tina", "helga", "alfred" ] },
{ "name" : "yves", "friends" : [ "sergei", "tiffany" ] },
{ "name" : "sandra", "friends" : [ "bob", "elena" ] }
]
这是较长的,语义上等效的查询的快捷方式:
FOR u IN users
RETURN { name: u.name, friends: (FOR f IN u.friends RETURN f.name) }
- 阵列收缩
>为了在嵌套数组中折叠(或展平)结果,AQL提供了[ ** ] 运算符。它的工作方式类似于[ * ]运算符,但还会折叠嵌套数组。
我们可以按如下方式扩展上面的查询,并仍然创建相同的嵌套结果:
```java
RETURN (
FOR u IN users RETURN u.friends[*].name
)
现在[**],在查询结束时附加运算符…
RETURN (
FOR u IN users RETURN u.friends[*].name
)[**]
- 内联表达式
- 可以在迭代数组时过滤元素,限制返回元素的数量并使用当前数组元素创建投影。此简写形式不支持排序。
嵌套数字和数组收缩的示例:
LET arr = [ [ 1, 2 ], 3, [ 4, 5 ], 6 ]
RETURN arr[**]
// RETURN arr[** FILTER CURRENT % 2 == 0]
所有偶数都以平面数组返回:
[
[ 2, 4, 6 ]
]
MERGE(),collection之间的document关联
- 案例二
假如现在让student的level字段和teacher中的数据相关联
- step1 各自创建集合
- step2 添加数据
LET data = [
{ "name": "Robert", "sex": "男", "age": 19,"level":["A","B","C","D"]},
{ "name": "Jaime", "sex": "女", "age": 20,"level":["A","B","C"]}
]
FOR d IN data
INSERT d INTO student
let data = [
{ "_key": "A", "en": "strong", "de": "stark" },
{ "_key": "B", "en": "weak", "de": "dark" }
]
FOR d IN data
INSERT d INTO teacher
- step3 只关注level字段 与 en关联,并且让其显示
FOR c IN student
RETURN MERGE(c,{ level: DOCUMENT("teacher", c.level)[*].en })
- step4 level字段和en,de关联
FOR c IN student
RETURN MERGE(c, { level: (for t in DOCUMENT("teacher", c.level) RETURN {en:t.en,de:t.de})} )