2014-06-09 117 views
5

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

这里是一个工作的查询返回正确的数据(虽然尚未汇总):

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": 50, 
      "description": "some description" 
     }, 
     { 
      "amount": 500, 
      "description": "some description" 
     }, 
     { 
      "amount": 0, 
      "description": "some description" 
     } 
     ], 
     [ 
     { 
      "amount": 0, 
      "description": "some description" 
     }, 
     ] 
    ] 
    } 
] 

我使用收集到组的业绩,因为给定的memberId可能有多个'RegMem'对象。从查询/结果中可以看到,每个对象都有一个名为'items'的小对象列表,每个对象都有一个数量和一个描述。

我想SUM()成员的金额。但是,像这样调整查询不起作用:

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()函数的金额字段值。

理想情况下,查询应返回memberId和总金额,每行成员一行,以便我可以删除过滤器并为所有成员执行。

非常感谢您提前帮助您! Martin

PS我已经完成了arangodb网站上的AQL教程,并检查了手册,但真正帮助我的是加载更多示例查询来查看。如果有人知道这样的资源或想分享他们自己的一些资源,“非常有义务。干杯!

回答

3

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

我在此格式下创建一些文件复制数据(以及一些只有一个项目):

{ 
    "memberId": "40289", 
    "items": [ 
    { 
     "amount": 50, 
     "description": "some description" 
    }, 
    { 
     "amount": 500, 
     "description": "some description" 
    } 
    ] 
} 

基础的一些这些类型的文件,您的非汇总查询确实应该这样看的:

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 
    } 
] 
+0

非常感谢您的帮助!我不知道flatten函数,但在调用它时出现错误:“[1540]使用未知函数'FLATTEN()'”。它是用户定义的吗?无论如何,我接受你的回答,我可以通过以下方式修改你提供的查询以获得所需的结果: FOR m IN pkg_spp_RegMem FILTER m.memberId ==“40289” COLLECT member = m.memberId INTO g RETURN {“memberId”:member,“amount”:SUM((for r IN g [*]。m [*]。items FOR i IN r RETURN i.amount))} – Martin

+1

[FLATTEN ()](https://docs.arangodb.com/Aql/ArrayFunctions.html)绝对是一个标准的数组函数。从v2.7开始,您还可以使用新的多星运算符:https://www.arangodb.com/2015/06/aql-improvements-for-2-7/ – CoDEmanX