首页 > 解决方案 > 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。

标签: arangodb

解决方案


你还没有提到你想如何做到这一点,所以我将假设 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


推荐阅读