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 中,有 DatabaseCollectionDocument 三类基本概念。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]