ArangoDB 学习笔记

新工作需要用到 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.mzph.cn/diannao/23281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wpf、winform 监听USB拔插时触发

C# USB拔插监听 C#查找设备管理器中所有的 USB 设备 wpf、winform 监听USB拔插时触发 监听Windows USB 拔插时触发 private void MainWindow_Loaded(object sender, RoutedEventArgs e){FleckWebSocketConfig.OpenSocketConfig().GetAwaiter(); //websocket 服务开启用于监听W…

MySQL 判断查询条件是否包含某字符串的几种方式

在日常的数据库操作中&#xff0c;我们经常需要判断某个字段中是否包含特定的字符串。在 MySQL 中&#xff0c;有多种方式可以实现这一需求。本文将介绍几种常见的方式&#xff0c;并详细说明它们的使用场景和优缺点。 1. 使用 LIKE 进行模糊查询 LIKE 是最常见的字符串匹配方…

python手动搭建transformer,并实现自回归推理

以下是添加了详细注释的代码和参数介绍&#xff1a; Transformer 实现及自回归推理 本文展示了如何手动实现一个简化版的Transformer模型&#xff0c;并用自回归方式实现一个seq2seq任务&#xff0c;例如机器翻译。 导入必要的库 import torch import torch.nn as nn import…

【区分vue2和vue3下的element UI DatePicker 日期选择器组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 中&#xff0c;我们通常使用 Element UI 的 DatePicker 日期选择器组件。然而&#xff0c;如前所述&#xff0c;Element UI 并没有官方支持 Vue 3 的版本。但有一个叫做 Element Plus 的库&#xff0c;它是 Element UI 的 Vue 3 版本&#xff0c;并提供了类似的 DateP…

TypeScript学习(二):数据类型

/** *一.typescript类型学习 */ //1.1 number类型 let a:number; a123; //这么写会报错&#xff0c;a"hello,world"; console.log(a); //1.2 string类型 let b:string; b"hello,world"; console.log(b); //1.3 boolean类型 let c:booleantrue; c…

华为OD刷题C卷 - 每日刷题 13(图像物体的边界,英文输入法)

1、&#xff08;图像物体的边界&#xff09;&#xff1a; 这段代码是解决“图像物体的边界”的问题。它提供了一个Java类Main&#xff0c;其中包含main方法和getResult方法&#xff0c;以及一个内部UnionFindSet类&#xff0c;用于计算像素1代表的物体的边界个数。 main方法首…

C#操作MySQL从入门到精通(11)——对查询数据使用正则表达式过滤

前言 对于之前提到的使用匹配、比较、通配符等过滤方式能解决大部分的项目问题,但是有时候也会遇到一些比较复杂的过滤需求,这时候就需要正则表达式来实现了,正则表达式使用regexp这个关键字来实现。 本次测试的数据库表的内容如下: 1、基本字符匹配(包含某些字符) 匹…

嵌入式之存储基本知识

系列文章目录 嵌入式之存储基本知识 嵌入式之存储基本知识 系列文章目录一、RAM与ROM二、DRAM和SRAM三、SDRAM&#xff08;DRAM的一种&#xff09;四、DDR 一、RAM与ROM RAM&#xff08;随机存取存储器&#xff09;和ROM&#xff08;只读存储器&#xff09;是两种不同类型的计…

揭秘VVIC API:开启高效数据交互的密钥,你的项目就差这一步

VVIC API接口概述 VVIC API提供了对VVIC服务的数据访问和操作功能。通过此API&#xff0c;开发者可以集成VVIC服务到他们的应用程序中&#xff0c;实现数据同步、用户认证、资源管理等功能。 点击获取key和secret API端点示例 用户认证 方法&#xff1a;POSTURL&#xff1a;/…

【JS】JavaScript编程语言-(Object)对象属性标志与对象属性描述符(2024-06-05)

我们知道&#xff0c;对象可以存储属性。 到目前为止&#xff0c;属性对我们来说只是一个简单的“键值”对。但对象属性实际上是更灵活且更强大的东西&#xff1a;其他配置选项。 1、属性标志 对象属性&#xff08;properties&#xff09;&#xff0c;除 value 外&#xff0c…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:无人机自主飞行软件平台

案例简介 北京泛化智能科技有限公司&#xff08;gi&#xff09;所主导开发的 Generalized Autonomy Aviation System (GAAS) 是为无人机以及城市空中交通 (UAM, Urban Air Mobility) 所设计的开源无人机自主飞行框架。通过 SLAM、路径规划和 Global Optimization Graph 等功能…

【Linux】(三)—— 文件管理和软件安装

文件管理 Linux的文件管理是系统管理中的核心部分&#xff0c;它涉及到如何组织、访问、修改和保护文件及目录结构。 目录 文件管理基本概念常用命令查看和切换目录创建文件和目录删除文件和目录文件拷贝移动和重命名文件文件查看cat文件查看more查找文件查找文本 数据流和管道…

redsystems教程的基本使用之重置密码(忘记密码解决方法)

前言&#xff1a; 相信很多人都有疑惑&#xff0c;要是我不记得密码怎么办&#xff1f;如果你登录了&#xff0c;点击更改密码后&#xff0c;还是要你填写登录密码才能修改。为了解决这问题&#xff0c;博主通过了钻研成功搞出来了&#xff01;&#xff01;&#xff01;&#…

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

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

Marvelous Designer中一些棉质布料预设

Marvelous Designer中一些棉质布料预设的解释&#xff1a; Cotton_14_Wale_Corduroy&#xff1a;14条细鲸鱼纹的灯芯绒&#xff0c;适合制作温暖且有质感的服装。Cotton_40s_Chambray&#xff1a;40支精梳针织的府绸布&#xff0c;通常用于制作休闲衬衫。Cotton_40s_Poplin&am…

Nginx目录文件

Nginx目录文件 在 Nginx 的安装目录下&#xff0c;你可能会看到许多文件夹和文件。以下是对各个文件夹和文件的简要解释&#xff1a; conf.d: 这个文件夹通常用于存放额外的配置文件。Nginx 在启动时&#xff0c;会读取该文件夹下的所有配置文件&#xff0c;并将其内容合并到…

Face Forgery Detection by 3D Decomposition

文章目录 Face Forgery Detection by 3D Decomposition研究背景研究目标创新点方法提出问题研究过程技术贡献实验结果未来工作Face Forgery Detection by 3D Decomposition 会议:CVPR2021 作者: 研究背景 面部伪造引发关注传统面部伪造检测主要关注原始RGB图像

邮箱地址验证软件

邮箱地址验证软件是一种用于检测邮箱地址是否真实存在、有效和可送达的工具。这些软件通常服务于邮件营销、客户数据清洗或研究领域&#xff0c;以帮助用户提高邮件发送的成功率并减少 bounce rate&#xff08;退回率&#xff09;。易邮地址验证软件就是这么一款软件。 易邮件…

学Python,看一篇就够

学Python&#xff0c;看一篇就够 python基础注释变量标识符命名规则使用变量认识bugDebug工具打断点 数据类型输出转义字符输入输入语法输入的特点 转换数据类型pycharm交互运算符的分类赋值运算符复合赋值运算符比较运算符逻辑运算符拓展 条件语句单分支语法多分支语法拓展 if…

XFF注入【墨者靶场】

目录 XFF介绍 靶场练习 最近在复习XFF注入&#xff0c;这里使用墨者靶场来简单的练习一下该漏洞的利用方法 XFF介绍 X-Forwarded-For&#xff1a;简称XFF头&#xff0c;代表了HTTP的请求端真实的IP。 它被认为是客户端通过HTTP代理或者负载均衡器连接到web服务端获取源ip地…