ArangoDB 学习笔记

news/2024/9/20 1:28:45/ 标签: 学习, 笔记

新工作需要用到 arangodb,由于之前没有接触过,所以从头开始学,记录一下学习过程中的重点。

一. ArangoDB 安装

1. 下载地址

官网地址:https://www.arangodb.com/download/

2. 部署步骤

  1. 下载 rpm 安装包并安装
    rpm -ivh arangodb3-3.10.6-1.0.x86_64.rpm
  2. 修改配置文件
    修改配置文件/etc/arangodb3/arangod.conf,将endpoint = tcp://127.0.0.1:8529中的127.0.0.1更改为主机ip
  3. 设置 root 密码
    arango-secure-installation
    
  4. 启动 arangoDB 服务
	- service arangodb3 start  #启动arangoDB- service arangodb3 stop  #关闭arangoDB- service arangodb3 restart  #重启arangoDB- service arangodb3 status  # 查看arangoDB的状态
  1. 进入命令行模式
	arangosh

二. ArangoDB 操作命令

1. 数据库操作

1)创建数据库

db._createDatabase("example");

2)切换数据库

db._useDatabase("example");

3)获取当前数据库名、ID 和地址

require("@arangodb").db._name();
require("@arangodb").db._id();
require("@arangodb").db._path();

4)删除数据库

db._dropDatabase("example")

5)列出所有数据库

db._databases();

2. 表操作

1)创建集合

db._create("users");

2)删除集合

db._drop("users");

3)列出所有集合

db._collections();

3. 数据操作 ( Shell )

1)添加数据

db.users.insert({ 
"_id":"user/1", 
"_key":"123", 
"name":"user1", 
"age":23, 
"interests":["game","music"] 
})

批量新增:

db.users.insert([
{"date1"},
{"date2"},
...
{"dateN"}
])

2)修改数据

db.users.update(
{"_key": "123"}, 
{"age": 35}
);

3)删除数据

db.users.remove({"_key":"124"});

4)统计数据

db.users.count();

5)返回集合文档对象

  • 返回所有文档
    db.users.all().toArray();
    
  • 返回指定数量文档
    db.users.all().limit(2).toArray();
    
  • 返回随机文档
    db.users.any();
    
  • 根据条件查询文档对象
    db.users.byExample({
    "name": "user1",
    "age":35
    }).toArray();
    
  • 返回查询结果中的第一个文档对象
    db.users.firstExample("age", 35);
    
  • 根据 _id 或 _key 查询文档对象
    db.users.document({"_id":"users/123"});
    db.users.document({"_key": "123"});
    db.users.document(["123","124"]);
    
  • 判断文档是否存在
    db.users.exists("123");
    
  • 按 _key 删除文档
    db.users.removeByKeys(["123","124"]);
    

4. AQL 语法

1)插入单个对象

INSERT {"name": "Ned","surname": "Stark","alive": true,"age": 41,"traits": ["A","H","C","N","P"]
} INTO test

2)批量插入对象

AQL不允许INSERT在单个查询中针对同一集合的多个操作。但是可以使用FOR循环体,插入多个文档。

LET data = [{ "name": "Robert", "surname": "Baratheon", "alive": false, "traits": ["A","H","C"] },{ "name": "Jaime", "surname": "Lannister", "alive": true, "age": 36, "traits": ["A","F","B"] },{ "name": "Catelyn", "surname": "Stark", "alive": false, "age": 40, "traits": ["D","H","C"] },{ "name": "Cersei", "surname": "Lannister", "alive": true, "age": 36, "traits": ["H","E","F"] },{ "name": "Daenerys", "surname": "Targaryen", "alive": true, "age": 16, "traits": ["D","H","C"] },{ "name": "Jorah", "surname": "Mormont", "alive": false, "traits": ["A","B","C","F"] },{ "name": "Petyr", "surname": "Baelish", "alive": false, "traits": ["E","G","F"] },{ "name": "Viserys", "surname": "Targaryen", "alive": false, "traits": ["O","L","N"] },{ "name": "Jon", "surname": "Snow", "alive": true, "age": 16, "traits": ["A","B","C","F"] },{ "name": "Sansa", "surname": "Stark", "alive": true, "age": 13, "traits": ["D","I","J"] },{ "name": "Arya", "surname": "Stark", "alive": true, "age": 11, "traits": ["C","K","L"] },{ "name": "Robb", "surname": "Stark", "alive": false, "traits": ["A","B","C","K"] },{ "name": "Theon", "surname": "Greyjoy", "alive": true, "age": 16, "traits": ["E","R","K"] },{ "name": "Bran", "surname": "Stark", "alive": true, "age": 10, "traits": ["L","J"] },{ "name": "Joffrey", "surname": "Baratheon", "alive": false, "age": 19, "traits": ["I","L","O"] },{ "name": "Sandor", "surname": "Clegane", "alive": true, "traits": ["A","P","K","F"] },{ "name": "Tyrion", "surname": "Lannister", "alive": true, "age": 32, "traits": ["F","K","M","N"] },{ "name": "Khal", "surname": "Drogo", "alive": false, "traits": ["A","C","O","P"] },{ "name": "Tywin", "surname": "Lannister", "alive": false, "traits": ["O","M","H","F"] },{ "name": "Davos", "surname": "Seaworth", "alive": true, "age": 49, "traits": ["C","K","P","F"] },{ "name": "Samwell", "surname": "Tarly", "alive": true, "age": 17, "traits": ["C","L","I"] },{ "name": "Stannis", "surname": "Baratheon", "alive": false, "traits": ["H","O","P","M"] },{ "name": "Melisandre", "alive": true, "traits": ["G","E","H"] },{ "name": "Margaery", "surname": "Tyrell", "alive": false, "traits": ["M","D","B"] },{ "name": "Jeor", "surname": "Mormont", "alive": false, "traits": ["C","H","M","P"] },{ "name": "Bronn", "alive": true, "traits": ["K","E","C"] },{ "name": "Varys", "alive": true, "traits": ["M","F","N","E"] },{ "name": "Shae", "alive": false, "traits": ["M","D","G"] },{ "name": "Talisa", "surname": "Maegyr", "alive": false, "traits": ["D","C","B"] },{ "name": "Gendry", "alive": false, "traits": ["K","C","A"] },{ "name": "Ygritte", "alive": false, "traits": ["A","P","K"] },{ "name": "Tormund", "surname": "Giantsbane", "alive": true, "traits": ["C","P","A","I"] },{ "name": "Gilly", "alive": true, "traits": ["L","J"] },{ "name": "Brienne", "surname": "Tarth", "alive": true, "age": 32, "traits": ["P","C","A","K"] },{ "name": "Ramsay", "surname": "Bolton", "alive": true, "traits": ["E","O","G","A"] },{ "name": "Ellaria", "surname": "Sand", "alive": true, "traits": ["P","O","A","E"] },{ "name": "Daario", "surname": "Naharis", "alive": true, "traits": ["K","P","A"] },{ "name": "Missandei", "alive": true, "traits": ["D","L","C","M"] },{ "name": "Tommen", "surname": "Baratheon", "alive": true, "traits": ["I","L","B"] },{ "name": "Jaqen", "surname": "H'ghar", "alive": true, "traits": ["H","F","K"] },{ "name": "Roose", "surname": "Bolton", "alive": true, "traits": ["H","E","F","A"] },{ "name": "The High Sparrow", "alive": true, "traits": ["H","M","F","O"] }
]FOR d IN dataINSERT d INTO test

3)检索集合中所有文档

FOR c IN test
RETURN c

4)检索指定文档

RETURN DOCUMENT("test","6377")
RETURN DOCUMENT("test",["6377","6378"])

5)更新文档

UPDATE "6377" WITH {alive:true} IN test

6)替换文档

REPLACE "6377" WITH {name: "Ned",surname: "Stark",alive: false,age: 41,traits: ["A","H","C","N","P"]
} IN test

7)删除文档

REMOVE "6377" IN test

8)匹配文档

FILTER
查找满足比 _key 相等更复杂的文档,能够为要匹配的文档制定任意条件。

  • 等于条件
FOR c IN testFILTER c.name == "Ned"RETURN c
  • 范围条件
FOR c IN testFILTER c.age >= 13RETURN c.name
  • 多种条件
FOR c IN testFILTER c.age < 13FILTER c.age != nullRETURN { name: c.name, age: c.age }//orFOR c IN testFILTER c.age < 13 AND c.age != nullRETURN { name: c.name, age: c.age }
  • 替代条件
FOR c IN testFILTER c.name == "Jon" OR c.name == "Joffrey"RETURN { name: c.name, surname: c.surname }

-模糊检索

FOR c IN testFILTER c.name LIKE "%KE%"RETURN c

或者

FOR c IN testFILTER CONTAINS(c.name, "KE")RETURN c

9)限制语法

LIMIT后面跟着一个最大显示数的数字,限制结果显示行数。

FOR c IN testLIMIT 5RETURN c.name

还可以使用LIMIT来跳过一定数量的记录返回下一个n个文档:

FOR c IN testLIMIT 2, 5RETURN c.name

10)排序语法

SORT()

DESC降序来反转排序顺序

FOR c IN testSORT c.name DESCLIMIT 10RETURN c.name

11)去重

查询表中数据的所有字段并去重返回

FOR doc IN usersLET fields = ATTRIBUTES(doc)FOR j IN fieldsRETURN DISTINCT j

12)组长度计算

FOR u IN usersCOLLECT WITH COUNT INTO lengthRETURN length

13)统计表数据量

RETURN COUNT(IPAddress)

三. 图(Graph)

1. 示例

现在有3张表:owner、car和carGraph
分别记录车辆拥有人、车辆信息与两者之间的关系

1. 创建 owner 表和 car 表,并插入数据

INSERT {"name": "John","userId": "123","carId": "456"
} INTO owner
INSERT {"id": "456","carName": "Toyota Camry"
} INTO car

2. 创建 carGraph 表并记录 owner 表与 car 表之间的边信息

INSERT {"_from": "A/A_document_id","_to": "B/B_document_id"
} INTO carGraph

3. 创建查询语句,可以根据 owner 表中的 name 查询出该用户拥有车辆的车名

FOR a IN ownerFILTER a.userId == "123"  // 根据需要的条件过滤A表中的数据LET b = (FOR v, e, p IN 1..1 OUTBOUND a._id carGraph  // 在C表中查找与A表关联的边RETURN DOCUMENT(car, p.vertices[1]._id)  // 获取边的_to顶点,即B表中的文档)RETURN b[0].carName  // 返回B表中的carName字段

在AQL查询中,FOR v, e, p IN 1..1 OUTBOUND a._id C这一行代码中的vep是用来定义变量的标识符。

  • v:表示顶点(vertex),在这个查询中,它代表A表中的文档。
  • e:表示边(edge),在这个查询中,它代表C表中的边。
  • p:表示路径(path),在这个查询中,它代表从A表到B表的路径。

这个查询使用了OUTBOUND关键字,表示从A表的顶点出发,沿着C表中的边向外部(即B表)遍历。通过FOR v, e, p IN 1..1 OUTBOUND a._id C这一行代码,我们定义了三个变量vep,用于在遍历过程中获取顶点、边和路径的信息。

  • v用于获取当前遍历到的顶点的信息,可以通过v.fieldName来访问顶点的字段。
  • e用于获取当前遍历到的边的信息,可以通过e.fieldName来访问边的字段。
  • p用于获取当前遍历到的路径的信息,可以通过p.vertices来访问路径上的顶点列表。

在这个查询中,我们只需要获取B表中的carName字段,所以并没有直接使用vep这些变量。但是,为了能够正确地遍历A表到B表的路径,我们需要在FOR语句中定义这些变量。


http://www.ppmy.cn/news/1467505.html

相关文章

浅谈Qt:跨平台开发的现在与未来

在软件开发领域&#xff0c;跨平台框架一直是热门话题。Qt作为一个成熟且功能丰富的跨平台C开发库&#xff0c;自从1991年由挪威Trolltech公司开发以来&#xff0c;已经走过了30多年的历程。Qt主要用于开发图形用户界面&#xff08;GUI&#xff09;程序&#xff0c;同时也支持开…

学习笔记——IP地址网络协议——网络掩码(Netmask)

三、网络掩码(Netmask) 1、网络掩码概述 网络掩码(Netmask)又称子网掩码(Subnet Mask)网络掩码为32 bit&#xff0c;与IP地址的位数一样&#xff0c;通常也以点分十进制数来表示。 子网掩码不能单独存在&#xff0c;它必须结合IP地址一起使用。子网掩码只有一个作用&#xf…

【C语言】文件操作(终卷)

前言 我们在上一卷中了解了顺序读写的函数&#xff0c;现在就让我们从随机读写的函数开始吧。 什么是随机读写&#xff1f; 就是想在哪个位置读或写都行&#xff0c;比较自由。文件打开时光标默认在起始位置。想从后面的某个部分读或写&#xff0c;就得让文件指针来到那个位…

定制高温隧道炉,如何判断质量好坏

在现代工业生产中&#xff0c;高温隧道炉扮演着不可或缺的角色。对于特定工艺要求&#xff0c;如陶瓷烧制、金属热处理等&#xff0c;定制化的高温隧道炉更是不可或缺。然而&#xff0c;面对市场上琳琅满目的产品&#xff0c;如何判断高温隧道炉的质量好坏成为了企业决策者面临…

leetcode 575.分糖果

思路&#xff1a;开两个数组&#xff0c;一个用来存储非负数的糖果个数&#xff0c;一个用来存储负数的糖果个数&#xff0c;这两个数组都是状态数组&#xff0c;而不是计数数组 如果当前能够吃的种类大于现有的种类&#xff0c;现有的种类个数就是答案&#xff1b; 如果当前…

微信小程序-案例:本地生活-首页(不使用网络数据请求)

一、 1.页面效果&#xff1a; 二、 1.新建项目并添加页面 在app.json文件中&#xff1a; "pages": ["pages/home/home","pages/message/message","pages/contact/contact"] 2.配置导航栏效果 在app.json文件中&#xff1a; &quo…

IO流-----各种流(对象流,内存流,打印流,随机访问流)

各种流 各种流&#xff1a;对象流&#xff1a;操作&#xff1a;对象输入输出流&#xff1a;写入数据&#xff1a;读取数据&#xff1a; 内存流&#xff1a;内存输出流&#xff1a;内存输入流&#xff1a; 打印流&#xff1a;字节打印流&#xff1a;字符打印流&#xff1a; 随机…

5.27机器人基础-机械臂逆解

前面简单讲了机械臂的正解问题&#xff0c;即通过原位姿和控制各关节的角度得到终点位姿。而在实际应用的时候&#xff0c;我们通常都是知道起始点和末端终点的位姿&#xff0c;需要考虑如何达到&#xff0c;即运动学机械臂的运动学逆解问题。 求解操作臂运动学方程是一个非线…

LLaSM:Large language and speech model

1.Introduction 级联方法使用ASR将语音输入转化为文本输入,语音到文本会导致信息损失,本文提出LLaSM,一个具有跨模态对话能力的大型语音与语言模型,能够理解和遵循语音与语言指令,借鉴LLaVA,利用预训练的语音模态编码器和大语言模型,使用Whisper作为语音编码器,将语音…

DP动态规划(上)

文章目录 动态规划基本概念斐波那契数列问题C 实现Python 实现Java 实现 迷你结C、Python和Java在实现动态规划时有哪些性能差异&#xff1f;迷你结哪种语言在动态规划中更适合大规模数据处理?迷你结C有哪些知名的库适用于动态规划和大数据处理?动态规划辅助库大数据处理库 迷…

NLP(21)--任务型对话机器人

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 问答系统 闲聊、任务型&#xff08;帮我设闹钟&#xff09;、回答型&#xff08;Q&A&#xff09; 任务型对话机器人&#xff1a;&#xff08;帮我定火车票/多轮次&#xff09; 领域识别&#xff08;分类、匹配&#xff…

【Python字符串攻略】:玩转文字,编织程序的叙事艺术

文章目录 &#x1f680;一.字符串基础&#x1f308;二.查看数据类型⭐三.转化❤️四.字符串索引&#x1f6b2;五.字符串切片&#x1f3ac;六.字符串切片-步长☔七.反向切片注意事项&#x1f6b2;八.字符串&#x1f4a5;查&#x1f4a5;改&#x1f4a5;删 ❤️九.字符串拼接&…

DS:数与二叉树的相关概念

欢迎来到Harper.Lee的学习世界&#xff01;博主主页传送门&#xff1a;Harper.Lee的博客主页想要一起进步的uu可以来后台找我哦&#xff01; 一、树的概念及其结构 1.1 树的概念亲缘关系 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限节点…

idea 常用插件推荐

文章目录 1、Lombok2、Convert YAML and Properties File3、Grep Console4、MyBatisX5、Free MyBatis Tool6、MyBatis Log EasyPlus &#xff08;SQL拼接&#xff09;7、MyBatisPlus8、Eclipse theme9、Eclipse Plus Theme10、Rainbow Brackets Lite - Free and OpenSource&…

Windows API 开发桌面应用程序,在窗口按下鼠标左键不放可以拖图,并且拖图期间鼠标图标变成手掌

在Windows API中&#xff0c;要实现鼠标左键按下并拖动以移动窗口中的某个图形&#xff0c;并且同时改变鼠标图标为“手掌”形状&#xff08;这通常指的是“拖动”或“移动”的图标&#xff09;&#xff0c;你需要执行几个步骤。 以下是一个基本的步骤指南&#xff0c;用于在W…

多扇区轮询存储提高FLASH使用寿命

/********************************************************************************* brief flash 多扇区轮询存储(用于提高flash使用寿命)******************************************************************************1.数组首位UserData[第一位] 和 UserData[最后一…

常用maven - jar 下载与 安装

1. guava 如果你想直接将 JAR 文件安装到本地 Maven 仓库&#xff0c;而不使用 POM 文件&#xff0c;可以使用 mvn install:install-file 命令并手动提供必要的元数据。以下是步骤&#xff1a; 下载 Guava JAR 文件&#xff1a; 从 Maven Central 仓库下载 Guava JAR 文件&am…

Django 默认 CSRF 保护机制

Django 的默认 CSRF 保护机制旨在防止跨站请求伪造攻击(CSRF)。CSRF 攻击是一种恶意攻击,其中攻击者通过伪造用户的请求来执行未授权的操作。Django 通过以下方式实现 CSRF 保护: 1. CSRF 中间件 Django 包含一个 CSRF 中间件 (CsrfViewMiddleware),它会自动添加到项目的…

U9C的数据查询视图Sql

U9C的数据查询视图Sql if object_id(TEMPDB..#priceTable) is not null begin drop table #priceTable endcreate table #priceTable (polineCreatedOn date,price varchar(max),itemid varchar(max),purchaseOrderdocno varchar(max),)insert into #priceTable select max(…

代理IP类型有哪些?定义与区别

您应该对代理有了一定的了解。但是&#xff0c;代理服务器也有不同的类型。就其来源而言&#xff0c;最常见的代理服务器类型是住宅代理和数据中心代理&#xff1a; 1、住宅代理 住宅代理是 ISP 向房主提供的 IP 地址。它是与物理位置关联的真实 IP 地址&#xff0c;因此允许…