[英]ArangoDB List Object Data from Group (AQL)
我正在尝试列出顶点对象,每个顶点对象都是具有相同组名的最早日期的顶点对象。 我正在尝试使用COLLECT和AGGREGATE:
FOR v,e IN 1..2 OUTBOUND obj.id
GRAPH 'CollectionGraph'
COLLECT groupName = v.groupName
AGGREGATE minDate = MIN(v.date)
RETURN {groupName, minDate}
此查询仅返回组名称和日期(假设MIN函数按照我希望的方式工作)。 我不确定如何根据组名和使用最早的日期条件从分组中实际获取整个顶点对象。
如果愿意, COLLECT
会将记录分类到存储桶中,并且只获取存储桶上的标签。 可选地,还可以返回每个文档中的文档数。 丢弃相同范围内的所有其他内容(即文档v
和e
)。 然而,在COLLECT
之后仍然可以访问在FOR
循环/遍历附近定义的变量。
如果您想知道每个存储桶中的内容,则需要使用备用语法
COLLECT ... INTO ...
它有多种型号,主要用于性能调整。 但是,让我们坚持基本的变体:
FOR v, e IN 1..2 OUTBOUND obj.id GRAPH 'CollectionGraph'
COLLECT group = v.groupName INTO groups
RETURN (
FOR g IN groups
SORT g.v.date
LIMIT 1
RETURN g
)
在此示例中未使用group
,但它在语法上是必需的。 然而, groups
存储INTO
哪个桶。 我们可以使用它根据date
属性对每个组进行排序并返回第一个文档。
注意:没有RETURN ( )
, LIMIT 1
会影响外部FOR
循环,整个查询只返回一个文档 - 这不是我们想要的。 使用子查询创建新范围并使限制适用于“内部”循环。
你也可以用另一种方式解决你的问题:
FOR v, e IN 1..2 OUTBOUND obj.id GRAPH 'CollectionGraph'
COLLECT group = v.groupName
AGGREGATE minDate = MIN(v.date)
RETURN (
FOR doc IN yourCollection
FILTER doc.groupName == group AND doc.date == minDate
LIMIT 1
RETURN doc
)
确定这些组以及每组中的最早日期。 然后,使用组名称和日期过滤集合yourCollection
,并返回一个文档。 这里的缺点是只能扫描(高效)单个集合,但遍历可能会为您提供来自多个集合的文档。 如果您知道需要检查哪些集合,则可以为每个集合编写子查询,然后组合结果。 与我上面给出的第一个查询相比,它将是更多的AQL代码,并且可能表现更差。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.