ArangoDB 收集排序和限制

问题描述

我正在寻找一个简单的问题的解决方案。我来自 MysqL 开发,但这里仍然有问题,AQL 也有问题。我想在没有重复文章键的情况下显示带有页面分页用户评论我有一个评论

_key,user_key,content_key,comment,stamp_create 

示例:

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

现在我需要输出所有按stamp_create DESC排序的评论,但带有汇总的content_key,对于MysqL,“分组依据”就足够了。 所以我用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 个结果,而不是 Limit 中指定的 3 个。不幸的是,页面分页没用,因为我得到的结果或多或少(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 个结果。最大的缺点是速度不是很快,我有很多用户评论超过 60K。

必须读入整个(过滤后的)数据集(也可以是 60K 长),然后重新排序。这一定更容易做到。

所以我的问题是,有没有一种高效的方法可以让这一切变得更快更容易?

谢谢

解决方法

在 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 团队 :-)