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*/3.AQL注释: /*this is a comment*/
4.KEEP, COUNT, OPTIONS, PRUNE, SEARCH, TO关键字不是保留关键字,可以用作属性名称,但是AQL可以类比sql把它们识别为类似关键字:
KEEP = COLLECTCOUNT(WITH COUNT INTO) = COLLECTOPTIONS = FOR/SEARCH/COLLECT/INSERT/UPDATE/...PRUNE:图遍历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" /*使用反斜杠转义*/"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 = 42RETURN {name, age}/*表达式可以作为属性值:属性name,address;address下有两个分属性street和zip*/{ "name" : "John", likes : [ "Swimming", "Skiing" ], "address" : { "street" : "Cucumber lane", "zip" : "94242" } }/*属性的速记命名*/ 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 DocumentTableFILTER u.name == mark /* 不能用u.name =="mark" */ FOR doc IN DocumentTable
FOR u IN usersFILTER u.id == CONCAT('prefix', @id, 'suffix') && u.name == @nameRETURN u/* CONCAT()是拼接函数 */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*/LET doc = { arg1:{agr2:"abc"} } RETURN doc.arg1.arg2 /*返回abc*/
(四)类型和值的大小顺序
null小于一切,[ ]小于{ },''小于' ', '0', 'abc', [ ], { }
(五)从集合访问数据
FOR u IN usersFILTER u.age < 39RETURN uFOR u IN users FILTER u.age < 39 RETURN u
将返回集合users中属性age的值小于39的所有文档,以及集合中根本没有属性age的所有文档。
(六)子查询
/*返回键值对*/FOR p IN personsLET recommendations = (FOR r IN recommendationsFILTER p.id == r.personIdSORT p.rank DESCLIMIT 10RETURN r)RETURN { person : p, recommendations : recommendations }/*返回键值对*/ 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 personsCOLLECT city = p.city INTO gRETURN {city : city,numPersons : LENGTH(g),maxRating: MAX(FOR r IN gRETURN r.p.rating) /*子查询结束*/}/*子查询在函数中的用法*/ 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 elem IN (RETURN [1,2,3]) RETURN elem
(七)查询结果的形式
/*查询所有结果*/FOR u IN usersRETURN u/*输出*/[{ "id": 1, "name": "John", "active": false },{ "age": 32, "id": 2, "name": "Vanessa" },{ "friends": [ "John", "Vanessa" ], "id": 3, "name": "Amy" }]/*查询特定的结果,筛选一些属性来输出*/FOR u IN usersRETURN { "id": u.id, "name": u.name }/*输出*/[{ "id": 1, "name": "John" },{ "id": 2, "name": "Vanessa" },{ "id": 3, "name": "Amy" }]/*只输出特定的值*/FOR u IN usersRETURN u.id/*输出*/[1,2,3]/*查询所有结果*/ 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" /*转义*//*以下表达式的值均为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[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]