# 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 &