[2个集合之间的ARANGO DB关系

问题描述 投票:0回答:1

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

{
  "firstName": "dasdsa",
  "lastName": "Deshpande",
  "emailAddress": "[email protected]",
  "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
1个回答
0
投票

您还没有提到您要怎么做,所以我假设是AQL。

首先,您的数据模型出了点问题。您的用户文档将numbers数组存储为applicationId属性,但是应用程序文档具有id属性,它是string。数据类型应该匹配,否则,如果不进行类型转换,就无法加入它们(这可能导致索引无法使用)。

[其次,我想知道为什么您选择将应用程序ID存储为id属性而不是默认为索引(主索引)的_key属性。我假设每个应用程序ID在整个集合中仅出现一次,以后不会更改吗?如果是这样,请考虑将应用程序ID作为字符串存储在_key属性中。否则,为id属性创建适当的索引。

对于实际查询:有两种主要的方法来加入集合,或者使用DOCUMENT()函数来解析ID,或者使用带有FILTER的附加FOR循环。但是请注意,您需要将应用程序ID存储为文档_key,以便能够使用第一种方法DOCUMENT()查找应用程序。嵌套的FOR循环方法更加灵活,可让您使用任何属性(包括未编制索引的属性)查找文档(但这可能会导致性能降低)。

FOR u IN user
  FILTER u.emailAddress == "[email protected]"
  RETURN { user: u, applications: DOCUMENT("application", u.applicationId) }

我在此处的电子邮件地址上使用FILTER来选择用户文档。也可以使用其他属性或使用LET u = DOCUMENT("user/<document-key>")DOCUMENT()函数的第一个参数是目标集合名称,第二个参数是文档_keys(应用程序ID)的数组。

如果要将应用程序ID保留在id属性中,则可以使用此查询:

FOR u IN user
  FILTER u.emailAddress == "[email protected]"
  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

© www.soinside.com 2019 - 2024. All rights reserved.