Запрос AQL «Многие ко многим»

#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}
  

В связи с этим, если у вас возникнут проблемы с производительностью при выполнении подзапроса для трейлеров, вы можете вместо этого попробовать просто выполнить объединение и расширение массива и посмотреть, работает ли это для вашего случая