#arangodb #aql
#arangodb #aql
Вопрос:
У меня есть 2 коллекции и одна коллекция ребер. ПОЛЬЗОВАТЕЛИ, ФАЙЛЫ и FILES_USERS. Я пытаюсь получить все ФАЙЛЫ документов, в которых для поля «что» установлено значение «видео», для конкретного пользователя, но также вставляю другой документ, также из ФАЙЛОВ коллекции, но где для «что» установлено значение «трейлер» и принадлежит «видео» в результатах.
Я пробовал приведенный ниже код, но он работает некорректно, я получаю много повторяющихся результатов … это беспорядок. Я определенно делаю это неправильно.
FOR f IN files
FILTER f.what=="video"
LET trailer = (
FOR f2 IN files
FILTER f2.parent_key==f._key
AND f2.what=="trailer"
RETURN f2
)
FOR x IN files_users
FILTER x._from=="users/18418062"
AND x.owner==true
RETURN DISTINCT {f,trailer}
Ответ №1:
Возможно, есть лучший способ сделать это с помощью синтаксиса запроса graph, но попробуйте это. Настройте УНИКАЛЬНЫЕ функции на основе вашей модели данных.
LET user_files = UNIQUE(FOR u IN FILES_USERS
FILTER u._from == "users/18418062" AND u.owner
RETURN u._to)
FOR uf IN user_files
FOR f IN files
FILTER f._key == uf AND f.what == "video"
LET trailers = UNIQUE(FOR t IN files
FILTER t.parent_key == f._key AND t.what == "trailer"
RETURN t)
RETURN {"video": f, "trailers": trailers}
Комментарии:
1. это решило проблему, за исключением того, что вместо f._id вместо f._key был f._id
Ответ №2:
Что ж, проверьте, есть ли у вас дублирующиеся данные, как предлагает TMan, однако также проверьте синтаксис вашего запроса. Похоже, что у вас нет связи между вашим подзапросом f и x в основном запросе. Это может привести к тому, что запрос потенциально вернет много дубликатов, если в коллекции files_users для пользователей пользователей имеется несколько записей/18418062
Попробуйте добавить соединение в основной запрос. Что-то вроде:
FOR x IN files_users
FILTER x._from=="users/18418062"
AND x.owner==true
AND x._to == f._id
RETURN DISTINCT {f,trailer}
В связи с этим, если у вас возникнут проблемы с производительностью при выполнении подзапроса для трейлеров, вы можете вместо этого попробовать просто выполнить объединение и расширение массива и посмотреть, работает ли это для вашего случая