ArangoDB自学笔记(万字!!全!!)

本文乃博主通过对Arangodb的官网自学后所做的笔记,可能有不足的地方,欢迎在评论区中指出,本人定虚心接受本文是博主写在word上,再复制到博客中的,因此会有些排版问题,如果有影响阅读的地方,也可在评论区指出,或者私聊我下载与安装1.1下载官网下载:www.arangodb.com登录网页端:127.0.0.1:85291.2安装解压下载的压缩包 用管理员模式运行命令提示符,找到解压文件的bin目录 arangod --install-service,出现如下的情...
摘要由CSDN通过智能技术生成

本文乃博主通过对Arangodb的官网自学后所做的笔记,可能有不足的地方,欢迎在评论区中指出,本人定虚心接受

本文是博主写在word上,再复制到博客中的,因此会有些排版问题,如果有影响阅读的地方,也可在评论区指出,或者私聊我

 

  • 下载与安装

1.1下载

官网下载:www.arangodb.com

登录网页端:127.0.0.1:8529

1.2安装

  1. 解压下载的压缩包
  2. 用管理员模式运行命令提示符,找到解压文件的bin目录
  3. arangod --install-service ,出现如下的情况,即为安装成功

     

 

在服务中可以找到启动的ArangoDB

    

 

  1. 接着在bin目录下启动arangod.exe ,出现have fun,说明服务启动
  2. 再点击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

布尔值,可能值为falsetrue

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]

[1,2]<[2]

如果是两个对象进行比较,如果对象内部的属性值对应相等,则整体相等,其他则按上述规则进行比较

如:

{ “a” : 1 , ”b” : 2 } == {“b”:2 , “a”:1}

 

  • 错误

产生运行时异常的原因主要有:

  1. 除零异常:除数为0
  2. 算术运算符中的无效操作数:非数字值用于算术运算符时发生
  3. 逻辑运算符中的无效操作数:在逻辑运算中使用任何非布尔值作为操作数时发生

 

  • AQL的局限性
  1. 一个AQL查询不能使用超过1000条结果寄存器(这是个什么东西?)
  2. 一个AQL查询不能使用超过2048个集合
  3. 在同一个AQL语句中,对A集合进行了写入操作,就不能对A集合进行读取操作
  4. 必须在查询的初始的with语句中声明动态访问的所有集合。
  5. 表达式内部的子查询会先一步执行,这意味着子查询不会参与操作数的惰性求值(惰性求值是什么?)

 

  • 运算符

比较运算符:可以与任何数据类型一起使用,返回值为布尔类型

操作符

描述

==

等于

!=

不等

<

小于

<=

小于等于

>

大于

>=

大于或等于

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:

  • 17
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值