ArangoDB AQL 基本操作

# ArangoDB configuration file
#
# Documentation:
# https://docs.arangodb.com/Manual/Administration/Configuration/
#

[server]
authentication = true
endpoint = tcp://[::]:8530
storage-engine = rocksdb
[log]
level = INFO
[rocksdb]
max-total-wal-size=1GiB
write-buffer-size=2GiB 
max-write-buffer-number=2
total-write-buffer-size=8GiB
dynamic-level-bytes=false
#block-cache-size=10MiB
#enforce-block-cache-size-limit=true
[cache]
size=10MiB

CRUD

在使用AQL插入文档之前,我们需要一个放置文档的地方—集合。集合可以通过web接口、arangosh或驱动程序来管理。但是,使用AQL是不可能做到这一点的。
在这里插入图片描述
在这里插入图片描述
创建好接下来就可以单击QUERIES。使用 AQL 语句进行 CRUD 操作,将其粘贴到查询文本框中然后单击 Execute 运行。在这里插入图片描述

//单条插入
INSERT {
	"name": "hbw",
	"age": 28,
	"work": true,
	"hobby": ["A", "B", "C"]
} INTO characters
//RETURN NEW(需要返回值添加)
//多条插入
LET data = [
	{"name": "TOm","age": 78,"work": true,"hobby": ["A"]},
	{"name": "JErry","age": 80,"work": true,"hobby": ["B"]},
	{"name": "Mike","age": 50,"work": true,"hobby": ["C"]},
	{"name": "Jeef","age": 49,"work": true,"hobby": ["A", "B"]},
	{"name": "allen","age": 28,"work": false,"hobby": ["A", "C"]},
	{"name": "kite","age": 20,"work": false,"hobby": ["B", "C"]},
	{"name": "bill","age": 17,"work": false,"hobby": ["A", "B", "C"]}
]
//FOR variableName IN expression用于遍历数据数组的每个元素
FOR d IN data INSERT d INTO characters

AQL 不允许在一个查询中针对同一个集合执行多个插入操作。但是,它可以作为 FOR 循环的主体,插入多个文档。

//遍历全部
FOR c IN characters RETURN c
//根据id获取唯一
RETURN DOCUMENT("characters/characters/37898")
//根据多个id获取
RETURN DOCUMENT("characters", ["37898", "38028"])
//属性更新指定的文档(如果不存在属性,则添加它们),但不修改其余的属性。
UPDATE "37898" WITH { age: 5 } IN characters
//批量更新
FOR c IN characters UPDATE c WITH { age: 28 } IN characters
//要替换整个文档内容,可以使用 REPLACE 代替 UPDATE
REPLACE "37898" WITH {
    "name": "new",
    "age": 1000,
    "work":true
} IN characters
//删除
REMOVE "37898" IN characters

Matching Documents

到目前为止,我们要么查找单个文档,要么返回整个字符集合。为了找到满足某些复杂条件下的文档,AQL 中有一个过滤器操作,它使我们能够制定任意的条件来匹配文档。

//过滤器条件
FOR c IN characters
    FILTER c.name == "new" OR c.name == "fy470"
    FILTER c.age <= 28 and c.age != null //null<0 true
    FILTER c.work == true
    //RETURN c
    SORT c.name DESC, c.age // 默认ASC
    LIMIT 1, 3 // 第一个起取3个
    RETURN { name: c.name, age: c.age }    

References to other Documents

注意到 hobby 这个字段存储的内容 A、B、C、D 是一串没有明显意义的字母,我们可以将它认为是一类标签,通过字典获取其真实含义。适用标签可以减少数据的存储空间,这里也可以理解成关联查询。如果要重命名或翻译其中一个字符,则需要找到具有相同特征的所有其他字符文档。

为了使用这个字典需要 Create a document collection hobby

LET hobbys = [
	{ "_key": "A", "en": "pingpang", "ch": "乒乓" },
    { "_key": "B", "en": "soccer", "ch": "足球" },
    { "_key": "C", "en": "basketball", "ch": "篮球" }
]
FOR h IN hobbys INSERT h INTO hobbys

下边这2个语句就清晰的可以发现区别

FOR c IN characters RETURN c.hobby
FOR c IN characters RETURN DOCUMENT("hobbys", c.hobby)
//返回的信息太多,可以指定标签的扩展符号
FOR c IN characters RETURN DOCUMENT("hobbys", c.hobby)[*].en

Merging Characters

我们把字母解析成有意义的内容,但我们还不知道它们属于哪个角色。因此,我们需要合并字符文档。

FOR c IN characters RETURN MERGE(c, 
    {	//主表key: 关联table, 主表key
        hobby: DOCUMENT("hobbys", c.hobby)[*].en
    }
)

Join

在简单环境下上边的就可以满足需求,但是复杂情况设计过滤的就需要进行关联查询。

FOR c IN characters
	RETURN MERGE(c, {
		hobby: (
		//key key
		FOR key IN c.hobby 
			FOR h IN hobbys//table
				FILTER h._key == key
				RETURN h.en
    	)
    })

其他简单操作

FOR c IN characters RETURN CONCAT("name is ",c.name,", age is ",c.age )

Graph

在 ArangoDB 中,两个文档可以通过 Edge 文档链接。Edge 文档存储在Edge m集合中,并具有两个附加属性:_from 和 _to。它们通过文档 id 引用任何两个文档。
首先创建一个集合,类型选 Edge在这里插入图片描述

INSERT { _from: "characters/73171", _to: "characters/73171" } INTO childOf

也可以进行批量创建

LET data = [//关系数据
	{
		"parent": { "name": "TOm"},
		"child": { "name": "Mike"}
	}, {
		"parent": { "name": "TOm"},
		"child": { "name": "Jeef"}
	}, {
		"parent": { "name": "JErry"},
		"child": { "name": "Mike"}
	}, {
		"parent": { "name": "JErry"},
		"child": { "name": "Jeef"}
	}, {
		"parent": { "name": "Mike"},
		"child": { "name": "allen"}
	}, {
		"parent": { "name": "Mike"},
		"child": { "name": "kite"}
	}, {
		"parent": { "name": "Mike"},
		"child": { "name": "bill"}
	}, {
		"parent": { "name": "Jeef"},
		"child": { "name": "allen"},
	}, {
		"parent": { "name": "Jeef"},
		"child": { "name": "kite"},
	}, {
		"parent": { "name": "Jeef"},
		"child": { "name": "bill"},
	}
]

FOR rel in data
	LET parentId = FIRST(//FIRST()提取第一个元素
		FOR c IN characters
			FILTER c.name == rel.parent.name//筛选条件
			LIMIT 1
			RETURN c._id//返回_id
	)
	LET childId = FIRST(
		FOR c IN characters
			FILTER c.name == rel.child.name
			LIMIT 1
			RETURN c._id
	)
	FILTER parentId != null AND childId != null//剔除_id都为空的记录
	INSERT {_from: childId, _to: parentId} INTO childOf//将数据插入边集合
	RETURN NEW//返回数据

备份
/data/arangodb/bin/arangodump --output-directory /data/arango_dokb.bak_1109 --server.endpoint tcp://10.177.230.238:8529 --server.username Rootmaster --server.database cw_dokb --server.password “Rootmaster@777”

回滚
/data/app/arangodb/bin/arangorestore --input-directory /data/appData/arango_dokb --server.endpoint tcp://10.0.10.186:18119 --server.username Rootmaster --server.database cw_dokb --server.password “Rootmaster@777”

#10.55.193.213(主节点)
nohup /data/app/arangodb3/bin/arangodb --starter.data-dir /data/app/arangodb3/data --auth.jwt-secret /data/app/arangodb3/keyfile/jwtSecret &
#10.55.193.222(从节点)
nohup /data/app/arangodb3/bin/arangodb --starter.data-dir /data/app/arangodb3/data --auth.jwt-secret /data/app/arangodb3/keyfile/jwtSecret --starter.join 10.55.193.213 &
#10.59.226.172(从节点)
nohup /data/app/arangodb3/bin/arangodb --starter.data-dir /data/app/arangodb3/data --auth.jwt-secret /data/app/arangodb3/keyfile/jwtSecret --starter.join 10.55.193.213 &

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值