使用AQL在arangodb中进行聚合

使用AQL在arangodb中进行聚合,arangodb,aql,Arangodb,Aql,我正在arangodb中尝试一个相当基本的任务,使用SUM()聚合函数 下面是一个工作查询,它返回正确的数据(尽管尚未聚合): 这将返回以下结果: [ { "memberId": "40289", "amount": [ [ { "amount": 50, "description": "some description" } ], [ {

我正在arangodb中尝试一个相当基本的任务,使用SUM()聚合函数

下面是一个工作查询,它返回正确的数据(尽管尚未聚合):

这将返回以下结果:

[
  {
    "memberId": "40289",
    "amount": [
      [
        {
          "amount": 50,
          "description": "some description"
        }
      ],
      [
        {
          "amount": 50,
          "description": "some description"
        },
        {
          "amount": 500,
          "description": "some description"
        },
        {
          "amount": 0,
          "description": "some description"
        }
      ],
      [
        {
          "amount": 0,
          "description": "some description"
        },
      ]
    ]
  }
]
我使用Collect对结果进行分组,因为给定的memberId可能有多个“RegMem”对象。从查询/结果中可以看到,每个对象都有一个称为“项目”的较小对象列表,每个项目都有一个金额和一个说明

我想把会员的金额加起来。但是,这样调整查询不起作用:

FOR m IN pkg_spp_RegMem
FILTER m.memberId == "40289"
COLLECT member = m.memberId INTO g
RETURN { "memberId" : member, "amount" : SUM(g[*].m[*].items[*].amount) }
它返回0,因为它显然在扩展项列表中找不到名为amount的字段

查看结果,我可以理解其中的原因:返回结果时,项目实际上是一个列表,包含有数量/描述的对象列表。但是我不知道如何正确地引用或扩展未命名列表,以返回SUM()函数的amount字段值

理想情况下,查询应该返回memberId和total amount,每个成员一行,这样我就可以删除过滤器并为所有成员执行

如果你能帮忙的话,请提前向我表示感谢! 马丁


PS我已经在arangodb网站上完成了AQL教程,并查看了手册,但真正对我有帮助的是加载更多的示例查询以供查看。如果有人知道这样的资源,或者想分享自己的资源,那就太感谢了。干杯

编辑:第一次误读了问题。第一个可以在
编辑
历史记录中看到,因为它还包含一些提示:

我以这种格式创建了一些文档(有些文档只有一项),从而复制了您的数据:

基于其中一些类型的文档,您的非摘要查询应该是这样的:

FOR m IN pkg_spp_RegMem
FILTER m.memberId == "40289"
COLLECT member = m.memberId INTO g

RETURN { "memberId" : member, "amount" :  g[*].m[*].items }
返回的数据:

[
  {
    "memberId": "40289",
    "amount": [
      [
        {
          "amount": 50,
          "description": "some description"
        },
        {
          "amount": 0,
          "description": "some description"
        }
      ],
      [
        {
          "amount": 50,
          "description": "some description"
        },
        {
          "amount": 0,
          "description": "some description"
        }
      ],
      [
        {
          "amount": 50,
          "description": "some description"
        }
      ],
      [
        {
          "amount": 50,
          "description": "some description"
        },
        {
          "amount": 500,
          "description": "some description"
        }
      ],
      [
        {
          "amount": 0,
          "description": "some description"
        }
      ],
      [
        {
          "amount": 50,
          "description": "some description"
        },
        {
          "amount": 500,
          "description": "some description"
        }
      ]
    ]
  }
]
基于非汇总版本,您需要循环通过collect函数生成的组的项,并在那里执行
SUM()
。 为了能够对项目进行汇总,您必须在汇总项目之前将其
展平()
到一个列表中

FOR m IN pkg_spp_RegMem
FILTER m.memberId == "40289"
COLLECT member = m.memberId INTO g

RETURN { "memberId" : member, "amount" :  SUM(
                                              FLATTEN(
                                                       (
                                                         FOR r in g[*].m[*].items
                                                         RETURN r[*].amount
                                                       )
                                                     )
                                             )
       }
这导致:

[
  {
    "memberId": "40289",
    "amount": 1250
  }
]

非常感谢你的帮助!我不知道flatte函数,但调用它时出错:“[1540]使用未知函数‘flatte()’”。它是用户定义的吗?在任何情况下,我都非常感激地接受您的回答,因为我能够通过以下方式修改您提供的查询,以获得所需的结果:对于pkg_spp_RegMem FILTER中的m,m.memberId==“40289”COLLECT member=m.memberId INTO g RETURN{“memberId”:member,“amount”:SUM((对于g中的r[].m[].I中的项RETURN I.amount))}绝对是一个标准的数组函数。从v2.7开始,您还可以使用新的multi-star操作符进行展平:
FOR m IN pkg_spp_RegMem
FILTER m.memberId == "40289"
COLLECT member = m.memberId INTO g

RETURN { "memberId" : member, "amount" :  SUM(
                                              FLATTEN(
                                                       (
                                                         FOR r in g[*].m[*].items
                                                         RETURN r[*].amount
                                                       )
                                                     )
                                             )
       }
[
  {
    "memberId": "40289",
    "amount": 1250
  }
]