arangodb - 2个集合之间的ARANGO DB关系
问题描述
我需要知道如何在 arangoDB 中获取主子关系。我有一个名为 user 的以下文档集合,如下所示
{
"firstName": "dasdsa",
"lastName": "Deshpande",
"emailAddress": "Abc@GAURAV.CO.IN",
"password": "aA@1234",
"applicationId": [
180031,
180091
],
"isActiveUser": "false",
"isAdminUser": "false",
}
和名为 application 的第二个文档集合
{
"id":"180031",
"applicationName": "firstApp",
"description": "first app description"
}
{
"id":"180091
",
"applicationName": "secondApp",
"description": "first app description"
}
我想根据标记给用户的应用程序 ID 检索应用程序名称。在这种情况下,我想检索 firstApp 和 secondApp。
解决方案
你还没有提到你想如何做到这一点,所以我将假设 AQL。
首先,您的数据模型有问题。您的用户文档将数字数组存储为applicationId
属性,但应用程序文档有一个字符串id
属性。数据类型应该匹配,否则你不能在没有类型转换的情况下加入它们(这可能导致索引未被使用)。
其次,我想知道您为什么选择将应用程序 ID 存储为id
属性而不是_key
默认索引的属性(主索引)。我假设每个应用程序 ID 在整个集合中只出现一次并且以后不会更改?如果是这样,请考虑将应用程序 ID 作为字符串存储在_key
属性中。否则为该id
属性创建一个适当的索引。
对于实际查询:有两种主要方法可以加入集合,或者使用DOCUMENT()
函数来解析 ID,或者使用带有 FILTER 的附加 FOR 循环。但是请注意,您需要将应用程序 ID 存储为文档_key
,以便能够使用第一种方法使用DOCUMENT()
. 嵌套的 FOR 循环方法更灵活,允许您使用任何属性查找文档,包括未编入索引的文档(但这可能会导致性能下降)。
FOR u IN user
FILTER u.emailAddress == "Abc@GAURAV.CO.IN"
RETURN { user: u, applications: DOCUMENT("application", u.applicationId) }
我在此处的电子邮件地址上使用过滤器来选择用户文档。这也可能在不同的属性上或使用LET u = DOCUMENT("user/<document-key>")
. 该DOCUMENT()
函数的第一个参数是目标集合名称,第二个参数是文档数组_keys
(应用程序 ID)。
如果要保留存储在id
属性中的应用程序 ID,可以使用以下查询:
FOR u IN user
FILTER u.emailAddress == "Abc@GAURAV.CO.IN"
LET applications = (FOR a IN application
FILTER a.id IN u.applicationId
RETURN a
)
RETURN { user: u, applications }
如果您将 ID 存储为文档键,同样的查询也可以工作,只需将条件替换为FILTER a._key IN u.applicationId
. 但是由于您可以在这种情况下使用DOCUMENT() 函数,所以我宁愿使用它,因为它更简单。
这在 AQL 教程 BTW 中有很好的描述:
https ://www.arangodb.com/docs/stable/aql/tutorial-join.html
推荐阅读
- go - 带有一个 go-exiftool 实例的循环挂在大量文件上
- javascript - appendBuffer() 不追加到 sourceBuffer
- javascript - 嵌套动态表单 Antd
- c++ - 无法在 Windows 上使用 mingw 将 sqlite3 与 c 连接
- spring-webclient - io.netty.channel.unix.Errors$NativeEceptionIoException: readAddress failed: Connection reset by peer 请求将被重试
- docker - 将 Docker 镜像推送到 Container Registry
- c - 使用套接字在客户端/服务器之间传输数据
- r - 数据框长到宽格式
- scala - 如何在 scala 中处理 CSV 文件,以便将其行分隔成数组?
- spring-boot - 在 SpringSecurity 中删除用户时获取 null SecurityContextHolder.getContext()