【问题标题】:ARANGO DB relation between 2 collections2个集合之间的ARANGODB关系
【发布时间】:2019-10-23 06:45:03
【问题描述】:

我需要知道如何在 arangoDB 中获取主子关系。 我在下面给出了一个名为 user 的以下文档集合

{
  "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 检索应用程序名称。在这种情况下,我想检索 firstApp 和 secondApp。

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    你没有提到你想怎么做,所以我假设 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() function,我宁愿使用它,因为它更简单。

    这在 AQL 教程 BTW 中有很好的描述:
    https://www.arangodb.com/docs/stable/aql/tutorial-join.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多