我将尝试一个相当基本的任务在arangodb中,使用SUM()聚合函数。
以下是一个有效的查询,它返回正确的数据(虽然还没有聚合):
这将返回以下结果:
以下是一个有效的查询,它返回正确的数据(虽然还没有聚合):
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"
},
]
]
}
]
我使用Collect来对结果进行分组,因为一个给定的memberId可能有多个'RegMem'对象。如您从查询/结果中看到的那样,每个对象都有一个称为“items”的较小对象列表,每个item都有一个金额和描述。
我想通过会员对金额进行求和。然而,像这样调整查询是不起作用的:
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和总金额,这样我就可以取消过滤并为所有成员执行。
非常感谢您的帮助! 马丁
附言:我已经完成了arangodb网站上的AQL教程并查阅了手册,但真正帮助我的是更多的示例查询供参考。如果有人知道这样的资源或想要分享自己的资源,"将不胜感激。谢谢!