【问题标题】:ArangoDB List Object Data from Group (AQL)ArangoDB 列出组中的对象数据 (AQL)
【发布时间】:2016-08-15 19:26:58
【问题描述】:

我正在尝试列出顶点对象,每个对象都是同一个组名中日期最早的对象。我正在尝试使用 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 函数按我预期的方式工作)。我不确定如何根据组名并使用最早的日期标准从分组中实际获取整个顶点对象。

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    COLLECT 如果愿意,会将记录分类到存储桶中,并且您只会获得存储桶上的标签。可选地,也可以返回每个文档中的文档数。相同范围内的所有其他内容都将被丢弃(即文档ve)。但是,在 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 代码,而且性能可能更差。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      相关资源
      最近更新 更多