ArangoDB的ASL的常⽤操作
arangodb 的 AQL的简单 CURD 操作
1、插⼊数据
单条插⼊
INSERT {
"name": "Ned",
"surname": "Stark",
"alive": true,
"age": 41,
"traits": ["A","H","C","N","P"]
} INTO Characters
语法是INSERT document INTO collectionName。该document是⼀个对象,您可以从JavaScript或JSON中了解它,它由属性键和值对组成。属性键周围的引号在AQL中是可选的。键总是字符序列(字符串),⽽属性值可以有不同的类型:
null
boolean (true, false)
number (integer and floating point)
string
array
object
我们插⼊的字符⽂档的名称和姓⽒都是字符串值。alive状态使⽤布尔值。年龄是⼀个数值。特征是⼀串字符串。整个⽂档是⼀个对象。
批量插⼊
LET data = [
{ "name": "Robert", "surname": "Baratheon", "alive": false, "traits": ["A","H","C"] },
{ "name": "Jaime", "surname": "Lannister", "alive": true, "age": 36, "traits": ["A","F","B"] },
{ "name": "Catelyn", "surname": "Stark", "alive": false, "age": 40, "traits": ["D","H","C"] },
{ "name": "Ramsay", "surname": "Bolton", "alive": true, "traits": ["E","O","G","A"] },
{ "name": "Ellaria", "surname": "Sand", "alive": true, "traits": ["P","O","A","E"] },
{ "name": "Daario", "surname": "Naharis", "alive": true, "traits": ["K","P","A"] },
{ "name": "Missandei", "alive": true, "traits": ["D","L","C","M"] },
{ "name": "Tommen", "surname": "Baratheon", "alive": true, "traits": ["I","L","B"] },
{ "name": "Jaqen", "surname": "H'ghar", "alive": true, "traits": ["H","F","K"] },
{ "name": "Roose", "surname": "Bolton", "alive": true, "traits": ["H","E","F","A"] },
{ "name": "The High Sparrow", "alive": true, "traits": ["H","M","F","O"] }
]
FOR d IN data
INSERT d INTO Characters
这个有点类似于编程语⾔,⾸先把数据复制给data这个变量,然后循环这个变量,挨个插⼊。INSERT语句中使⽤d不是具体的数据,⽽是变量。
2、获取数据
获取集合所有数据
RETURN c
这个循环和上⾯的循环⼜不⼀样啦,上⾯的数组data是⼀个数组变量,⽽这⾥的Characters确是⼀个集合,类似于我们mysql的表,这个循环会把这个collection中的所有数据打印出来,类似于遍历表的操作,例如select * from。
返回结果:
{
"_key": "2861650",
"_id": "Characters/2861650",
"_rev": "_V1bzsXa---",
"name": "Ned",
"surname": "Stark",
"alive": true,
"age": 41,
"traits": ["A","H","C","N","P"]
},
前⾯三个带下划线的是系统属性,可以在插⼊的时候指定或者系统⾃动赋值,但是数据插⼊之后就不能修改。带_都是只读的。id的结构为Collection/__key。
获取某条特定id的数据
RETURN DOCUMENT("Characters", "2861650")
// --- or ---
RETURN DOCUMENT("Characters/2861650")
只需要指定id,就可以返回相应的数据。2种书写⽅式都可⾏。
还可以⼀次获取多个⽂档
RETURN DOCUMENT("Characters", ["2861650", "2861653"])
// --- or ---
RETURN DOCUMENT(["Characters/2861650", "Characters/2861653"])
3、更新数据
UPDATE "2861650" WITH { alive: false } IN Characters
语法是UPDATE documentKey WITH object IN collectionName。它使⽤列出的属性更新指定的⽂档(如果它们不存在则添加它们),但保持其余不变。要替换整个⽂档内容,可以使⽤REPLACE:
REPLACE "2861650" WITH {
name: "Ned",
surname: "Stark",
alive: false,
age: 41,
traits: ["A","H","C","N","P"]
} IN Characters
也可以⽤循环,来为所有的数据修改某个属性,或者添加某个新的属性:
FOR c IN Characters
UPDATE c WITH { season: 1 } IN Characters
4、删除⽂件
要从collection中完全删除⽂档,请执⾏REMOVE操作。它的⼯作⽅式与其他修改操作类似,但没有WITH⼦句:
REMOVE "2861650" IN Characters
它也可以在循环体中:
REMOVE c IN Characters
AQL的复杂查询
上⾯的查询只是根据id返回结果,或者返回整个collection。下⾯我们来看⼀下有条件的AQL。
匹配document
过滤FILTER
FOR c IN Characters
FILTER c.name == "Ned"
RETURN c
过滤条件如下:“ 字符⽂档的属性name必须等于Ned ”。如果条件成⽴,则返回字符document。这适⽤于任何属性:
FOR c IN Characters
FILTER c.surname == "Stark"
RETURN c
除了==,还可以是>=、<=、>、<。
有个特殊情况:
FOR c IN Characters
FILTER c.age < 13
RETURN { name: c.name, age: c.age }
查询结果:
[
{ "name": "Tommen", "age": null },
{ "name": "Arya", "age": 11 },
{ "name": "Roose", "age": null },
...
]
年龄⼩于13,但是却会出现年龄为null。原因是,null⽂档中不存在此类属性,并且null将数字与较低的数字进⾏⽐较,参考它的值顺序,它意外地满⾜了年龄标准c.age < 13(null < 13)。
类型和值顺序
在检查相等或不等式时或确定值的排序顺序时,AQL使⽤确定性算法,该算法同时考虑数据类型和实际值。
⽐较操作数⾸先按其数据类型进⾏⽐较,如果操作数具有相同的数据类型,则仅按其数据值进⾏⽐较。
⽐较数据类型时使⽤以下类型顺序:
null < bool < number < string < array/list < object/document
这意味着null是AQL中的最⼩类型,⽽document是具有最⾼顺序的类型。如果⽐较的操作数具有不同的类型,则确定⽐较结果并完成⽐较。
多种条件
为了不让⽂档在没有age属性的情况下通过过滤器,我们可以添加第⼆个标准:
FOR c IN Characters
FILTER c.age < 13
FILTER c.age != null
RETURN { name: c.name, age: c.age }
这同样可以⽤布尔AND运算符写成:
FILTER c.age < 13 AND c.age != null
RETURN { name: c.name, age: c.age }
第⼆个条件也可以c.age > null。
替代条件
如果希望⽂档满⾜⼀个或另⼀个条件,可能还有不同的属性,请使⽤OR:
FOR c IN Characters
FILTER c.name == "Jon" OR c.name == "Joffrey"
RETURN { name: c.name, surname: c.surname }
排序和限制
限制结果计数
有时候我们可能并不需要返回所有的数据。在这些情况下,我们可以通过LIMIT()操作限制⽂档数量:
FOR c IN Characters
LIMIT 5
RETURN c.name
这样就只会返回前5个名字。
LIMIT后⾯跟着⼀个最⼤⽂件数的数字。但是,还有第⼆种语法,它允许您跳过⼀定数量的记录并返回下⼀个n个⽂档:
FOR c IN Characters
LIMIT 2, 5
RETURN c.name
这个语句的意思就是跳过前⾯2个数据,显⽰从第3到第8个数据。
按名称分类
直到此处显⽰查询结果的顺序基本上是随机的。要按定义的顺序返回它们,我们可以添加⼀个SORT()操作。如果结合使⽤LIMIT(),它会对结果产⽣很⼤影响,因为如果先排序,结果会变得可预测。
FOR c IN Characters
SORT c.name
LIMIT 10
RETURN c.name
和SQL⼀样,我们可以⽤DESC降序来反转排序顺序。第⼀种是升序,这是默认顺序。因为它是默认值,所以不需要明确要求ASC。
按多个属性排序
假设我们想按姓⽒排序。许多⾓⾊都有姓⽒。具有相同姓⽒的字符之间的结果顺序是未定义的。我们可以先按姓⽒排序,然后以名字确定顺序:
FOR c IN Characters
FILTER c.surname
SORT c.surname, c.name
LIMIT 10
RETURN {
surname: c.surname,
name: c.name
}
总的来说,⽂件按姓⽒排序。如果两个字符的surname相同,则⽐较name并对结果进⾏排序。
请注意,在排序之前应⽤过滤器,仅允许⽂档通过,实际上具有姓⽒值(许多⼈没有它并且会导致 null结果中的值)。
JOIN
基础合并
每个⼈的属性:
{
"name": "Ned",
"surname": "Stark",
"alive": false,
filter过滤对象数组
"age": 41,
"traits": ["A","H","C","N","P"]
}
Traits 这个集合⾥⾯放的是每个⼈的特点:
[
{ "_key": "A", "en": "strong", "de": "stark" },
{ "_key": "B", "en": "polite", "de": "freundlich" },
{ "_key": "C", "en": "loyal", "de": "loyal" },
{ "_key": "D", "en": "beautiful", "de": "schön" },
{ "_key": "E", "en": "sneaky", "de": "hinterlistig" },
{ "_key": "F", "en": "experienced", "de": "erfahren" },
{ "_key": "G", "en": "corrupt", "de": "korrupt" },
]
通过关联,在返回的结果中把每个⼈属性的字符改成Trais集合中的相应表⽰。
我们可以将traits数组与DOCUMENT()函数⼀起使⽤,将元素⽤作⽂档键,并在Traits集合中查它们:
FOR c IN Characters
RETURN DOCUMENT("Traits", c.traits)
[
[
{
"_key": "A",
"_id": "Traits/A",
"_rev": "_V5oRUS2---",
"en": "strong",
"de": "stark"
},
{
"_key": "H",
"_id": "Traits/H",
"_rev": "_V5oRUS6--E",
"en": "powerful",
"de": "einflussreich"
},
...
]
这样数据太多,我们可以只使⽤数组扩展符号返回英⽂标签:
FOR c IN Characters
RETURN DOCUMENT("Traits", c.traits)[*].en
查询结果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。