ArangoDB 系列(1) —— 初识 ArnagoDB

2022-05-07 16:12:37 浏览数 (1)

初识 ArangoDB

文章目录

  • 初识 ArangoDB
    • 前置知识
      • ArangoDB 的特性
    • ArangoDB 的安装与连接
    • ArangoDB 的操作
      • ArangoDB 的管理操作命令
        • 数据库管理命令
        • 集合管理命令
        • 集合相关方法
        • 图数据库
        • AQL 语句执行
      • ArangoDB 的 AQL 语法
        • 插入数据
        • 修改语句
        • 删除语句
        • 查询语句
        • 图的遍历查询

前置知识

ArangoDB 的特性

  • 灵活的数据类型,支持键值对、文档和图(用于保存社会关系)
  • 在运行对文档或者集合的查询时,能够有选择保持事务的一致性和隔离性
  • 具备复制与分片功能,能够对数据库进行失败配置,并且可以将大数据集分布在多个服务器上
  • 可配置的持久性,可以让应用程序在持久性和性能之间做出选择
  • ArangoDB 能够更加高效的使用现代存储硬件,类似于ssd 和大型缓存
  • 使用 ArangoDB 作为应用服务器,能够融合应用和数据,以适应更大的吞吐量

ArangoDB 的安装与连接

ArangoDB 社区版的下载地址: https://www.arangodb.com/download-major/ 这里我用的是 CentOS7 的操作系统

  • ArangoDB 服务端安装
代码语言:javascript复制
# 首先上传 ArangoDB 的服务端压缩包,并解压
tar -xf arangodb3-linux-3.9.0.tar
# 为 ArangoDB 配置环境变量
vi /etc/profile
# Ps: 这里我将压缩包解压在了 /root/temp 目录下,用户可以根据自己的解压目录自行更改
#====== 在文件末尾追加 ======
export ARANGO_HOME=/root/temp/arangodb3-linux-3.9.0
export PATH=$PATH:$ARANGO_HOME/bin
#======================
# 使环境变量生效
source /etc/profile
# 查看 ArangoDB 版本查看是否配置成功
arangodb --version
  • ArangoDB 的启动
代码语言:javascript复制
# 单节点启动命令
arangodb --starter.mode single --starter.data-dir /tmp/mydata
# 激活 failover 启动
arangodb --starter.mode activefailover --starter.data-dir /tmp/mydata
# 集群模式启动
arangodb --starter.mode cluster --starter.data-dir /tmp/mydata

Ps: /tmp/mydata 代表的是自定义的数据存储位置

  • ArangoDB 客户端安装与连接
代码语言:javascript复制
# 上传 ArangoDB 的客户端压缩包,然后解压
tar -xf arangodb3-client-linux-3.9.0.tar
# 进入 ArangoDB 客户端目录
 cd arangodb3-client-linux-3.9.0/bin/
# 连接 ArangoDB 数据库(无验证模式)
./arangosh --server.authentication false --server.endpoint tcp://192.168.159.139:8529
# 连接 ArangoDB 数据库(开启验证情况下)
./arangosh --server.username usr --server.password password --server.endpoint tcp://192.168.159.139:8529

Ps:

  1. ArangoDB 在客户端压缩包里的 bin/ 目录下的所有可执行文件在服务端的压缩包中全部存在,如果是本地服务端安装的话,且已经配备了 ArangoDB 环境变量,则可以直接使用 arangosh 命令,无需安装 ArangoDB 客户端。
  2. ArangoDB 的默认连接端口8259
  • 可视化界面

直接在浏览器里输入 http://192.168.159.139:8529/_db/_system/_admin/aardvark/index.html#collections 就可以看到 ArangoDB 的可视化界面

ArangoDB 的操作

ArangoDB 的管理操作命令

数据库管理命令
代码语言:javascript复制
# 创建数据库
db._createDatabase(database-name)
# 展示所有的数据库
db._databases()
# 使用数据库
db._useDatabase(database-name)
# 删除数据库
db._dropDatabase(database-name)
集合管理命令
代码语言:javascript复制
# 创建集合
db._create("Characters")
# 创建边的集合
db._createEdgeCollection("Relations")
# 获取集合 Characters 的信息(可用于获取集合)
db._collection("Characters")
# 获取集合 Characters 的信息(可用于获取集合)
db.Characters
# 列出所有的集合
db._collections()
# 删除集合内所有数据(不删除索引)
db._truncate("Characters")
# 删除集合(连带删除索引)
db._drop("Characters")
集合相关方法

使用 db.Characters.properties()db._collection("Characters").properties() 两种方式以直接调用相关方法,接下来主要以db._Collection("Characters") 方式为主。

代码语言:javascript复制
# 查看集合属性
db._collection("Characters").properties()
# 更改集合属性
db._collection("Characters").properties({ waitForSync : true })
# 重命名集合
db._collection("Characters").rename("Vertex")
# 获取集合统计信息
db._collection("Characters").figures()
# 获取集合的详细统计信息
db._collection("Characters").figures(true)
# 将集合数据加载到内存中
db._collection("Characters").load()
# 存入一个数据
 db._collection("Characters").save({"name":"张飞"})
 # 插入一条数据
 db._collection("Characters").insert({"name":"刘备"})
 # 查看集合内有多少个文档
 db._collection("Characters").count()
# 返回集合内任意一个文档
db._collection("Characters").any()
# 列出所有的数据
db._collection("Characters").all().toArray()
# 列出集合中的前两个数据
db._collection("Characters").all().limit(2).toArray()
# 按条件查找数据
db._collection("Characters").byExample({"name":"吕布"}).toArray()
# 按条件更新数据
db._collection("Characters").updateByExample({"name":"吕布"},{"name":"赵云"})
# 按条件删除数据
db._collection("Characters").removeByExample( {"name":"赵云"} )
# 依据 id 删除数据
db._collection("Characters").remove("Characters/22040")
# 按照 key 删除多个数据
db._collection("Characters").removeByKeys(["22052","22046"])
# 清空集合内的所有数据
db._collection("Characters").truncate()
# 删除集合
db._collection("Characters").drop()
图数据库
代码语言:javascript复制
# 创建顶点集合
db._create("vertex");
# 创建边集合
db._createEdgeCollection("relation");
# 定义图变量
var myGraph = {};
# 插入第一个顶点
myGraph.v1 = db.vertex.insert({ name : "vertex 1" });
# 插入第二个顶点
myGraph.v2 = db.vertex.insert({ name : "vertex 2" });
# 为两个边建立关系(第一个顶点为起点,第二个顶点为重点)
myGraph.e1 = db.relation.insert(myGraph.v1, myGraph.v2,{ label : "knows"});
# 查看边的内容
db._document(myGraph.e1);
# 查看顶点相关的边
db.relation.edges(myGraph.v1._id);
# 查看以某顶点为终点的边
db.relation.inEdges(myGraph.v2._id);
# 查看以某顶点为起点的边
db.relation.inEdges(myGraph.v1._id);
AQL 语句执行
代码语言:javascript复制
# 执行一条 AQL 语句
db._query(query).toArray()
# 带参数的执行 AQL
db._query(
'FOR c IN @@collection FILTER c._key == @key RETURN c._key', 
{ '@collection': 'mycollection',  'key': 'testKey'}).toArray();
# 查看执行计划
db._explain(query, bindParameters)

ArangoDB 的 AQL 语法

插入数据
代码语言:javascript复制
-- 插入一条记录
INSERT {
    "name": "Ned",
    "surname": "Stark",
    "alive": true,
    "age": 41,
    "traits": ["A","H","C","N","P"]} INTO Characters
-- 插入多条记录
------------------ 先定义变量 ---------------------
LET data = [
    { "name": "Robert", "surname": "Baratheon", "alive": false, "traits": ["A","H","C"] },
    { "name": "Jaime", "surname": "Lannister", "alive": true, "age": 36, "traits": ["A","F","B"] }
]

------------------ 插入多条数据 ------------------
FOR d IN data
    INSERT d INTO Characters
-- 插入边
INSERT { _from: "Characters/robb", _to: "Characters/ned" } INTO ChildOf
  • 插入的数据类型

数据类型

描述

null

空值

boolean

布尔类型变量,可选值为 true 和 false

number

数值类型,可以为整型数值和浮点数型数值

string

字符串类型

array/list

数组或列表类型

object/document

对象类型数据,也可成为文档类型数据,可用于序列化数据

修改语句
代码语言:javascript复制
-- 依据 id 更新数据
UPDATE "2861650" WITH { alive: false } IN Characters
-- 更新集合内的所有元素
FOR c IN Characters
    UPDATE c WITH { season: 1 } IN Characters
-- 更新整个文档内的内容
REPLACE "2861650" WITH {
    name: "Ned",
    surname: "Stark",
    alive: false,
    age: 41,
    traits: ["A","H","C","N","P"]} IN Characters
删除语句
代码语言:javascript复制
-- 根据 id 删除文档数据
REMOVE "2861650" IN Characters
-- 删除集合内所有的文档
FOR c IN Characters
    REMOVE c IN Characters
查询语句
代码语言:javascript复制
select --
-- 遍历文档
FOR c IN Characters RETURN c
-- 依据 id 查询文档
RETURN DOCUMENT("Characters/2861650")
-- 依据 id 查询文档
RETURN DOCUMENT("Characters", "2861650")
-- 依据多个 id 查询文档
RETURN DOCUMENT("Characters", ["2861650", "2861653"])
-- 依据多个 id 查询文档
RETURN DOCUMENT(["Characters/2861650", "Characters/2861653"])
-- 查询名称为 Ned  的数据
FOR c IN Characters
    FILTER c.name == "Ned"
    RETURN c
--  查询年龄大于13的数据
FOR c IN Characters
    FILTER c.age >= 13
    RETURN c.name
-- 查询年龄小于 13 的数据并输出指定的属性
FOR c IN Characters
    FILTER c.age < 13
    RETURN { name: c.name, age: c.age }
-- 多条件查询
FOR c IN Characters
    FILTER c.age < 13
    FILTER c.age != null
    RETURN { name: c.name, age: c.age }
-- 也可用 AND 连接多个查询条件
FOR c IN Characters
    FILTER c.age < 13 AND c.age != null
    RETURN { name: c.name, age: c.age }
-- 用 or 连接两个查询条件
FOR c IN Characters
    FILTER c.name == "Jon" OR c.name == "Joffrey"
    RETURN { name: c.name, surname: c.surname }
-- 限制输出5个结果
FOR c IN Characters
    LIMIT 5
    RETURN c.name
-- 输出第3个开始输出后面5个结果
FOR c IN Characters
    LIMIT 2, 5
    RETURN c.name
-- 输出结果依据名称排名
FOR c IN Characters
    SORT c.name
    LIMIT 10
    RETURN c.name
-- 按照名称降序排序
FOR c IN Characters
    SORT c.name DESC
    LIMIT 10
    RETURN c.name
-- 依据多个特性进行排名
FOR c IN Characters
    FILTER c.surname
    SORT c.surname, c.name
    LIMIT 10
    RETURN {
        surname: c.surname,
        name: c.name
    }
图的遍历查询
代码语言:javascript复制
-- 以名为 Joffery 的顶点为出发点,正向遍历,步长为 1~2步,并输出终点节点的名称
FOR c IN Characters
    FILTER c.name == "Joffrey"
    FOR v IN 1..2 OUTBOUND c ChildOf
        RETURN DISTINCT v.name
-- 以名为 Ned 的顶点为出发点,逆向遍历,步长为 1 步,并输出终点节点的名称
FOR c IN Characters
    FILTER c.name == "Ned"
    FOR v IN 1..1 INBOUND c ChildOf
        RETURN v.name

0 人点赞