ARANGO DB связь между 2 коллекциями - PullRequest
0 голосов
/ 23 октября 2019

Мне нужно знать, как получить мастер дочерних отношений в arangoDB. У меня есть следующая коллекция документов с именем пользователя, указанная ниже

{
  "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"
    }

Я хочу получить имя приложения на основе идентификатора приложения, который был помечен наПользователь. В этом случае я хочу получить firstApp и secondApp.

1 Ответ

0 голосов
/ 24 октября 2019

Вы не упомянули, как вы хотите это сделать, поэтому я предполагаю, что AQL.

Прежде всего, что-то не так с вашей моделью данных. Ваш пользовательский документ хранит массив цифр как атрибут applicationId, но документы приложения имеют атрибут id, который представляет собой string . Типы данных должны совпадать, иначе вы не сможете присоединиться к ним без приведения типов (что может привести к неиспользованию индексов).

Во-вторых, мне интересно, почему вы решили сохранить идентификатор приложения в качестве атрибута idвместо атрибута _key, который индексируется по умолчанию (первичный индекс). Я предполагаю, что каждый идентификатор приложения встречается только один раз во всей коллекции и не изменится позже? Если это так, рассмотрите возможность сохранения идентификатора приложения в виде строки в атрибуте _key. В противном случае создайте соответствующий индекс для атрибута id.

К фактическому запросу: существует два основных подхода к объединению коллекций: использование функции DOCUMENT() для разрешения идентификаторов или использование дополнительного цикла FORс ФИЛЬТРОМ. Однако обратите внимание, что вам необходимо сохранить идентификатор приложения как документ _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 атрибут, вы можете использовать этот запрос:

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 }

Тот же запрос будет работать, если вы сохранили идентификаторы как ключи документа, просто замените условие на FILTER a._key IN u.applicationId. Но поскольку в этом сценарии вы можете использовать функцию DOCUMENT () , я бы предпочел использовать ее как более простую.

Это хорошо описано в руководстве по AQL. BTW:
https://www.arangodb.com/docs/stable/aql/tutorial-join.html

...