ArangoDB收集排序和限制

pgvzfuti  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(168)

我正在寻找一个解决方案,什么应该是一个简单的问题。我来自一个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个。对于页面分页不幸无用,因为我得到或多或少的结果(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长)必须读入,然后重新排序。这一定更容易做到。
所以我的问题是,有没有一种性能更好的方法可以让这个过程更快更容易?
谢谢

y3bcpkx1

y3bcpkx11#

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

相关问题