Вы не упомянули, как вы хотите это сделать, поэтому я предполагаю, что 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