ArrangoDB文档/By aakz0347
一、介绍
类似于sql,是DML,而不是DDL、DCL。
DML:数据操纵语言,SELECT, UPDATE, DELETE
DDL:数据定义语言,CREATE, ALTER, DROP
DCL:数据库控制语言,GRANT, DENY
DQL:数据库查询语言,REVOKE, COMMIT, ROLLBACK
二、AQL基础知识
(零)AQL结构
在 ArangoDB 中,有 Database
、Collection
、Document
三类基本概念。Database 是 Collection 的集合,Collection 中存储着数据记录,数据记录也就是 Document。
对比关系数据库:
Database
与关系数据库中的数据库概念、作用相同,用于权限控制、界限划分,ArangoDB 中默认的 Database 称为_system
;Collection
相当于关系数据库中的表;Document
则相当于表中的行,但不同于关系数据库,Document 中列不固定,每个 Document 都包含着随机的任意数量的键值对。每个 Document 都有一个默认属性_key
,它是独一无二的、不可更改的、可自动生成的,Document 还有另一个默认属性_id
,它等于<collection name>/<document _key>
。
(一)AQL语法
1.要么进行数据检索(查询),要么进行数据修改:
对于查询,必须使用RETURN;对于修改,有关键字INSERT, UPDATE等
2.一个语句中,只能允许一次查询
3.AQL注释: /*this is a comment*/
4.KEEP, COUNT, OPTIONS, PRUNE, SEARCH, TO关键字不是保留关键字,可以用作属性名称,但是AQL可以类比sql把它们识别为类似关键字:
KEEP = COLLECT
COUNT(WITH COUNT INTO) = COLLECT
OPTIONS = FOR/SEARCH/COLLECT/INSERT/UPDATE/...
PRUNE:图遍历
5.关键字不区分大小写,但名称区分大小写
6.命名:避免使用特殊字符,属性名称不要以下划线开头,属性长度无要求
(二)AQL数据类型
null, boolean, number, string, array, object
1.number:整数或者小数,只要是实数都可以;支持+ - 以及小数点
2.string:必须用单引号或者双引号括起来,编码类型为UTF-8
"this is a word"
"this is a "quoted"" word" /*使用反斜杠转义*/
3.对于复合类型array, object:
array数组,类似于python,通过它们的位置来访问数组元素,形如u.friends[0]
[ -999, "yikes", [false, "no"], 1, kkk ]
object对象,对象中的每个属性都是一个键值对。
{"name888": mark01}
/*属性的速记命名*/
LET name = "Peter"
LET age = 42
RETURN {name, age}
/*表达式可以作为属性值:属性name,address;address下有两个分属性street和zip*/
{ "name" : "John", likes : [ "Swimming", "Skiing" ], "address" : { "street" : "Cucumber lane", "zip" : "94242" } }
4.点访问形式 u.address.city.name
(三)绑定参数
FILTER u.name == mark /* 不能用u.name =="mark" */
FOR doc IN DocumentTable
FOR u IN users
FILTER u.id == CONCAT('prefix', @id, 'suffix') && u.name == @name
RETURN u
/* CONCAT()是拼接函数 */
LET doc = { arg1:{agr2:"abc"} }
RETURN doc.arg1.arg2 /*返回abc*/
(四)类型和值的大小顺序
null小于一切,[ ]小于{ },''小于' ', '0', 'abc', [ ], { }
(五)从集合访问数据
FOR u IN users
FILTER u.age < 39
RETURN u
将返回集合users中属性age的值小于39的所有文档,以及集合中根本没有属性age的所有文档。
(六)子查询
/*返回键值对*/
FOR p IN persons
LET recommendations = (
FOR r IN recommendations
FILTER p.id == r.personId
SORT p.rank DESC
LIMIT 10
RETURN r
)
RETURN { person : p, recommendations : recommendations }
/*子查询在函数中的用法*/
FOR p IN persons
COLLECT city = p.city INTO g
RETURN {
city : city,
numPersons : LENGTH(g),
maxRating: MAX(
FOR r IN g
RETURN r.p.rating
) /*子查询结束*/
}
/*子查询结果展开*/
FOR elem IN (RETURN [1,2,3])
RETURN elem
(七)查询结果的形式
/*查询所有结果*/
FOR u IN users
RETURN u
/*输出*/
[
{ "id": 1, "name": "John", "active": false },
{ "age": 32, "id": 2, "name": "Vanessa" },
{ "friends": [ "John", "Vanessa" ], "id": 3, "name": "Amy" }
]
/*查询特定的结果,筛选一些属性来输出*/
FOR u IN users
RETURN { "id": u.id, "name": u.name }
/*输出*/
[
{ "id": 1, "name": "John" },
{ "id": 2, "name": "Vanessa" },
{ "id": 3, "name": "Amy" }
]
/*只输出特定的值*/
FOR u IN users
RETURN u.id
/*输出*/
[1,2,3]
三、运算符
(一)比较运算符
IN, NOT IN 测试值是否包含/不包含在数组中
LIKE, NOT LIKE 模式匹配,通常使用下划线或者百分号_ %
/*以下表达式的值均为true*/
"abc" LIKE "a%"
"abc" LIKE "_bc"
"a_foo" LIKE "a\_foo" /*转义*/
对于NOT LIKE,意思是排除长这样的字符,相当于 NOT ( ...LIKE... )
(二)数组比较运算符
ALL, ANY, NONE是修饰关键字,可以搭配IN, ==, !=, >等来使用
[1,2,3] ALL IN [1,2,4] false
[1,2,3] NONE IN [4,5,6] true
[1,2,3] ANY IN [1,2,50,51,52] true
[1,2,3] AT LEAST (2) IN [2,3,50,51,52] true
(三)逻辑运算符
用&& || ! 和 AND OR NOT都可以
(四)算数运算符
1.RETURN 支持常规运算 RETURN[-x, +y]
2.不支持**exp求幂,要用POW();不支持加号来拼接字符串,要用CONCAT()。
(五)范围运算符
使用两个小数点来表示,例如2010..2013等价于[2010,2011,2012,2013]