本文乃博主通过对Arangodb的官网自学后所做的笔记,可能有不足的地方,欢迎在评论区中指出,本人定虚心接受
本文是博主写在word上,再复制到博客中的,因此会有些排版问题,如果有影响阅读的地方,也可在评论区指出,或者私聊我
- 下载与安装
1.1下载
官网下载:www.arangodb.com
登录网页端:127.0.0.1:8529
1.2安装
- 解压下载的压缩包
- 用管理员模式运行命令提示符,找到解压文件的bin目录
- arangod --install-service ,出现如下的情况,即为安装成功
在服务中可以找到启动的ArangoDB
- 接着在bin目录下启动arangod.exe ,出现have fun,说明服务启动
- 再点击bin目录下的arangosh.exe,出现下图
直接回车
出现这样的结果,说明连接成功了
- 常用Shell命令
创建用户和密码 var users = require("@arangodb/users");
users.save("my_user", "my_password");
赋予权限 require("@arangodb/users").grantDatabase("my_user", "arangodb");
列出所有的数据库 db._databases();
创建新的数据库 db._createDatabase(“AAA”);
删除数据库 db._dropDatabase(“AAA”);
切换数据库 db._useDatabase(“AAA”);
创建集合 db._create(“test”);
删除集合 db._drop(“test”);
列出所有集合 db._collections();
更多命令通过 help查看
- CRUD
3.1创建/增加 C
创建一个users集合 db._create(“users”);
增加一条数据 INSERT { name : ”张三” , age: 27} INTO users
3.2查询 R
查询指定数据 RETURN DOCUMENT("users/9883")
查询多条数据 RETURN DOCUMENT(“users/9883”,”users/9665”)
DOCUMENT()返回值是数组
users :集合名
9883 :_key
查询所有的数据 FOR user IN users
FILTER user.age > 30
SORT user.age
LIMIT 2
RETURN user
表示对users集合进行迭代,以user作为变量名
FILTER :筛选的条件
如果字段值为null < 绝大多数字符,但不可靠
在实际生产的过程中,需要对null值进行处理
SORT :排序的关键字 默认ASC
可以进行多重排序,在后面添加字段
如:SORT user.name DESC,user.age DESC
LIMIT : 限制输出的个数
注意存在的位置,AQL的执行会按照语句顺序执行,提前LIMIT会对后续计算造成影响
RETURN: 输出结果
3.3更新/修改 U
修改一条数据 UPDATE "6432" WITH { sex : "man" } IN users
可用于为指定数据添加新的字段
替换一条数据 REPLACE"6432" WITH { sex : "man" } IN users
3.4删除D
删除一条数据 REMOVE "6432" IN users
- 其他简单操作
4.1 连接 CONCAT
连接字段 FOR user IN users
RETURN CONCAT("name is ",user.name,", sec is ",user.sex )
CONCAT中的字段以”,”连接
4.2多重循环
FOR user1 IN users
FOR user2 IN users
FILTER user1 != user2
RETURN [user1.name, user2.name]
自连接,将两个名字不同的组合输出
FOR user1 IN users
FOR user2 IN users
FILTER user1!=user2
RETURN {pair:[user1.name , user2.name],
sumAge:user1.age+user2.age}
自连接,名字组合成数组输出,并计算年龄总和
4.3临时变量LET
FOR user1 IN users
FOR user2 IN users
FILTER user1!=user2
LET sumAge=user1.age + user2.age
FILTER sumAge <100
RETURN {pair:[user1.name , user2.name],
sumAge:sumAge}
LET :定义一个临时变量 sumAge ,之后的临时变量可以直接使用
PS:此处sumAge:sumAge 可简写为 sumAge
4.4通过Document在A中查找B的数据(有join的味道)
FOR c IN Characters
RETURN DOCUMENT("Traits",c.traits)
以Traits集合为字典,输出Characters中traits特征的真实值
4.5 MERGE 替换/添加 特征 ****仅仅相当于一个文档的拼接
MERGE(A文档,B文档,C文档)
A文档中与B文档相同的特征会被替换,A文档中没有的特征会添加进去
替换A集合中的数据
下面两种方式实际上并没有替换集合中的数据,仅仅是在展示时将数据进行了拼接处理
方式一: 2.043ms
FOR c IN Characters
RETURN MERGE(c, { traits: DOCUMENT("Traits", c.traits)[*].en } )
方式二:
FOR c IN Characters
RETURN MERGE(c, {
traits: (
FOR key IN c.traits
FOR t IN Traits
FILTER t._key == key
RETURN t.en
)
})
- AQL语法
5.1语句类型
AQL的语句主要分为两种:
一种是查询语句,以RETURN返回
一种是操作语句,以(INSERT 、UPDATE、REPLACE、REMOVE)为主
5.2注释
AQL的注释分为两种:
单行注释 //
多行注释 /* ..... */
5.3关键字
关键字一般不能用作集合或者属性的名称,如果必须要用到的话,需要进行加”/”进行转义。且大部分关键字不区分大小写。
常用关键字
关键字 |
作用 |
FOR |
数组迭代 |
RETURN |
输出结果 |
FILTER |
条件过滤(非视图) |
SEARCH |
条件过滤(视图) |
SORT |
结果排序 |
LIMIT |
结果切片 |
LET |
变量定义 |
COLLECT |
结果分组 |
INSERT |
插入新文档 |
UPDATE |
(部分)更新现有文档 |
REPLACE |
替换指定文档 |
REMOVE |
删除指定文档 |
UPSERT |
插入新文档或更新现有文档 |
WITH |
指定查询中使用的集合 |
可以作为集合名或属性名的关键字
关键字 |
作用 |
KEEP |
COLLECT的变体 |
COUNT(WITH COUNT INTO) |
COLLECT的变体 |
OPTIONS |
在UPDATE / REPLACE / UPSERT / REMOVE操作之后使用,代表修改前的数据 |
PRUNE |
图形遍历,FOR的变体 |
SEARCH |
搜索操作 |
TO |
最短路径图的遍历中使用 |
关键字 |
作用 |
CURRENT |
在数组内联表达式中使用 |
NEW |
在INSERT / UPDATE / REPLACE / UPPERT 操作之后使用,代表修改后的数据 |
OLD |
在UPDATE / REPLACE / UPSERT / REMOVE操作之后使用,代表修改前的数据 |
区分大小写的关键字
5.4名字(集合名、属性名、函数名、变量名)
关键字不能当作名字使用,如果使用关键字的话,需要转义,如:
FOR doc IN `filter`
RETURN doc.`sort`
PS:这个转义字符是波浪线那个键,不是单引号 ’ 或者 ”
变量名:
允许使用的字符为字母a到z(大小写),数字0到9,下划线(_)符号和美元($)符号。
但是不能以数字开头。
如果变量名以下划线字符开头,则必须在下划线后跟至少一个字母或数字。
- AQL数据类型
数据类型 |
描述 |
null |
空值 |
boolean |
布尔值,可能值为false和true |
number |
整数、小数 |
String |
UTF-8的文本值 |
Array |
序列化的数组数据,可以通过索引使用 |
Object |
序列化的对象数据,可以通过属性名去使用 |
- 绑定参数
FOR u IN users
FILTER u.name ==@name
RETURN u
@后可以跟字母和数字,作为绑定参数
在web页面中可以在右侧的界面中输入参数
在命令行中执行时,可以输入
{
"query": "FOR u IN users FILTER u.id == @id RETURN u",
"bindVars": {
"name": "张三"
}
}
如果在AQL中需要用到字符串连接处理,如:(需要使用字符串函数进行连接)
FOR u IN users
FILTER u.id == CONCAT('prefix', @id, 'suffix') && u.name == @name
RETURN u
绑定参数也可以用于获取对象属性,或者作为数组的索引,如:
LET doc = { foo: { bar: "baz" } }
RETURN doc.@attr.@subattr
// or
RETURN doc[@attr][@subattr]
对于高度嵌套的数据,如:
LET doc = { a: { b: { c: 1 } } }
RETURN doc.@attr
此时,要想获取到数值1,需要输入的绑定参数,不是 “a.b.c”,而是[ "a", "b", "c" ]
如果将绑定参数用于集合名,如:
FOR u IN @@collection
FILTER u.active == true
RETURN u
此时就需要使用 @@来表示绑定参数
PS:关键字不能用绑定参数来代替
- 数据类型与值的顺序
AQL比较数据的时候采用的是确定性算法,先比较数据类型,再比较值的大小
数据类型之间的大小关系如下:
null < boolean < number < string < array/list < object/document
这说明,null是AQL中最小的类型,而object是最大的类型,如果比较的双方数据类型不同,则按上述规则排序,
具体比较规则可根据下方来比较:
null < false < true < 0 < ‘’ < ’ ’ < ’0’ < ‘abc’ < [ ](数组) < { } (对象)
如果是两个复合型的数据比较,如:两个数组比较 [1,2] 与 [2,3]
递归比较其中的子元素
如:
[ ] < [0] 相当于 null < 0
- < [1]
[1,2]<[2]
如果是两个对象进行比较,如果对象内部的属性值对应相等,则整体相等,其他则按上述规则进行比较
如:
{ “a” : 1 , ”b” : 2 } == {“b”:2 , “a”:1}
- 错误
产生运行时异常的原因主要有:
- 除零异常:除数为0
- 算术运算符中的无效操作数:非数字值用于算术运算符时发生
- 逻辑运算符中的无效操作数:在逻辑运算中使用任何非布尔值作为操作数时发生
- AQL的局限性
- 一个AQL查询不能使用超过1000条结果寄存器(这是个什么东西?)
- 一个AQL查询不能使用超过2048个集合
- 在同一个AQL语句中,对A集合进行了写入操作,就不能对A集合进行读取操作
- 必须在查询的初始的with语句中声明动态访问的所有集合。
- 表达式内部的子查询会先一步执行,这意味着子查询不会参与操作数的惰性求值(惰性求值是什么?)
- 运算符
比较运算符:可以与任何数据类型一起使用,返回值为布尔类型
操作符 |
描述 |
== |
等于 |
!= |
不等于 |
< |
小于 |
<= |
小于等于 |
> |
大于 |
>= |
大于或等于 |
IN |
是否包含在数组中 |
NOT IN |
是否不包含在数组中 |
LIKE |
字符串是否与模式匹配 |
NOT LIKE |
字符串值是否与模式不匹配 |
=~ |
字符串值是否与正则表达式匹配 |
!~ |
字符串值是否与正则表达式不匹配 |
数组比较运算符:用于数组之间进行比较,在比较运算符前多了使用前缀ALL,ANY或NONE,数组比较运算符左侧都为数组,如:
[ 1, 2, 3 ] ALL IN [ 2, 3, 4 ] // false
[ 1, 2, 3 ] ALL IN [ 1, 2, 3 ] // true
[ 1, 2, 3 ] NONE IN [ 3 ] // false
[ 1, 2, 3 ] NONE IN [ 23, 42 ] // true
[ 1, 2, 3 ] ANY IN [ 4, 5, 6 ] // false
[ 1, 2, 3 ] ANY IN [ 1, 42 ] // true
[ 1, 2, 3 ] ANY == 2 // true
[ 1, 2, 3 ] ANY == 4 // false
[ 1, 2, 3 ] ANY > 0 // true
[ 1, 2, 3 ] ANY <= 1 // true
[ 1, 2, 3 ] NONE < 99 // false
[ 1, 2, 3 ] NONE > 10 // true
[ 1, 2, 3 ] ALL > 2 // false
[ 1, 2, 3 ] ALL > 0 // true
[ 1, 2, 3 ] ALL >= 3 // false
["foo", "bar"] ALL != "moo" // true
["foo", "bar"] NONE == "bar" // false
["foo", "bar"] ANY == "foo" // true
逻辑运算符:AQL中的两个操作数逻辑运算符将使用短路评估来执行,如果有子查询,则先执行子查询并提前进行评估
与运算符:&& 或者 AND
或运算符:|| 或者 OR
非运算符: ! 或者 NOT
PS: