COLLECT 如果愿意,会将记录分类到存储桶中,并且您只会获得存储桶上的标签。可选地,也可以返回每个文档中的文档数。相同范围内的所有其他内容都将被丢弃(即文档v 和e)。但是,在 FOR 循环/遍历附近定义的变量在 COLLECT 之后仍然可以访问。
如果您想知道每个存储桶的内容,您需要使用替代语法
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 代码,而且性能可能更差。