2个集合之间的ARANGO DB关系



我需要知道如何在arangoDB中获取主子关系。 我有一个以下文档集合,称为用户,下面给出

{
"firstName": "dasdsa",
"lastName": "Deshpande",
"emailAddress": "Abc@GAURAV.CO.IN",
"password": "aA@1234",
"applicationId": [
180031,
180091
],
"isActiveUser": "false",
"isAdminUser": "false",
}

和第二个名为应用程序的文档集合

{
"id":"180031",
"applicationName": "firstApp",
"description": "first app description"
}
{
"id":"180091
",
"applicationName": "secondApp",
"description": "first app description"
}

我想根据标记为用户的应用程序 ID 检索应用程序名称。在这种情况下,我想检索第一个应用程序和第二个应用程序。

你还没有提到你想怎么做,所以我假设 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

最新更新