Много ко многим AQL-запросам - PullRequest
1 голос
/ 20 апреля 2019

У меня есть 2 коллекции и одна коллекция края.ПОЛЬЗОВАТЕЛИ, ФАЙЛЫ и FILES_USERS.Я пытаюсь получить все документы FILES, которые имеют поле «what» для «video», для конкретного пользователя, но также встраивают другой документ, также из коллекции FILES, но где «what» имеет значение «trailer»и принадлежит к «видео» в результатах.

Я пробовал приведенный ниже код, но он не работает правильно, я получаю много повторяющихся результатов ... это беспорядок.Я определенно делаю это неправильно.

 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}

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Что ж, проверьте, есть ли у вас дублирующиеся данные, как предлагает 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}

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

1 голос
/ 24 апреля 2019

Может быть лучший способ сделать это с синтаксисом запроса графа, но попробуйте это.Настройте уникальные функции в соответствии с вашей моделью данных.

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