前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ArangoDB 系列(1) —— 初识 ArnagoDB

ArangoDB 系列(1) —— 初识 ArnagoDB

作者头像
求和小熊猫
发布2022-05-07 16:12:37
1.6K0
发布2022-05-07 16:12:37
举报

初识 ArangoDB

文章目录

前置知识

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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 初识 ArangoDB
    • 文章目录
      • 前置知识
        • ArangoDB 的特性
      • ArangoDB 的安装与连接
        • ArangoDB 的操作
          • ArangoDB 的管理操作命令
          • ArangoDB 的 AQL 语法
      相关产品与服务
      数据库管理
      数据库管理(Database Management Center,DMC)是一个高效,安全,可靠的数据库一站式管理平台。DMC 提供可视化的库管理、实例会话管理、SQL 窗口、SQL 安全审计、SQL 变更审批、实时监控、操作审计等数据库管理能力,集成诊断优化和数据可视化分析能力,从而简化和规范数据库管理操作、降低数据库运维门槛、提升运维效率。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档