问题描述
我正在寻找一个简单的问题的解决方案。我来自 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 团队 :-)