ArangoDB Collect, сортировка и ограничение

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

_key, user_key, content_key, comment, stamp_create 

Пример:

1, 4483, 200, "reply 1", "2021-04-24T14:55:55+00:00"
2, 4483, 200, "reply 2", "2021-04-24T14:56:23+00:00"
3, 4483, 201, "reply 1", "2021-04-23T17:10:15+00:00"
4, 4483, 202, "reply 1", "2021-04-23T12:30:35+00:00"
5, 4483 , 202, "reply 2", "2021-04-22T23:50:51+00:00"

Теперь мне нужен вывод всех комментариев, отсортированных по stamp_create DESC, но с суммированным content_key, с Mysql для этого было достаточно Group By. Поэтому я пробую это с помощью Collect.

FOR c IN comments FILTER c.user_key =="4483" SORT c stamp_create DESC COLLECT contentKeys = c.content_key RETURN contentKeys LIMIT 0,3

Обычно результат правильный, но сортировка не работает, потому что COLLECT его не запоминает. Ну тогда со старым добрым DISTINCT:

FOR c IN comments FILTER c.user_key =="4483" SORT c stamp_create DESC RETURN DISTINCT contentKeys LIMIT 0,3

Результат выглядит хорошо и сортировка правильная, но я получаю только 2 результата, а не 3, как указано в Limit. Для страницы, к сожалению, бесполезно, потому что я получаю более или менее результаты (MySQL делает это иначе с Group By).

Теперь попробуйте, приложив немного больше усилий:

FOR c IN comments
    FILTER c.user_key =="4483"
    COLLECT contentKeys = c.content_key INTO groups
    LET keys = first(FOR value IN groups[*].c SORT value.stamp_create DESC RETURN {key: value._key, stamp: value.stamp_create})
    SORT keys.stamp DESC
    LIMIT 0,3
    RETURN keys

Я загружаю сюда все комментарии, сгруппированные в группы, затем сортирую их внутри группы по, а затем снова в целом.

Результат правильный, и я также получил 3 результата. Большой недостаток в том, что это не очень быстро, и у меня много пользователей с более чем 60 тысячами комментариев.

Весь (отфильтрованный) набор данных (также может быть длиной 60 КБ) должен быть считан, а затем повторно отсортирован. Это должно быть проще.

Итак, мой вопрос: есть ли эффективный способ сделать это быстрее и проще?

Благодарность


person Admtech    schedule 30.04.2021    source источник
comment
Я не уверен, правильно ли понимаю ваши требования. Вам нужен список, в котором каждый content_key встречается ровно один раз, и этот список должен быть упорядочен по максимальной отметке всех комментариев каждого ключа содержимого. Это верно?   -  person mpoeter    schedule 01.05.2021


Ответы (1)


С помощью mpoeter мы нашли более быстрый и элегантный метод.

Вот решение:

FOR c IN comments
FILTER c.user_key =="4483"
COLLECT contentKeys = c.content_key AGGREGATE maxStamp = MAX(c.stamp_create) OPTIONS { method: "sorted" }
SORT maxStamp DESC
LIMIT 0,3
RETURN contentKeys

Спасибо команде ArangoDB :-)

person Admtech    schedule 03.05.2021