我正在使用SUM()聚合函数在arangodb中尝试一个相当基本的任务.
这是一个工作查询,它返回正确的数据(虽然尚未汇总):
FOR m IN pkg_spp_RegMem
FILTER m.memberId == "40289"
COLLECT member = m.memberId INTO g
RETURN { "memberId" : member, "amount" : g[*].m[*].items }
Run Code Online (Sandbox Code Playgroud)
这将返回以下结果:
[
{
"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"
},
]
]
}
]
Run Code Online (Sandbox Code Playgroud)
我使用Collect对结果进行分组,因为给定的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) }
Run Code Online (Sandbox Code Playgroud)
它返回0,因为它显然无法在名为amount的展开项列表中找到一个字段.
查看结果我可以理解为什么:返回结果,使得项目实际上是具有金额/描述的对象列表的列表.但我不明白如何正确引用或扩展未命名列表以返回SUM()函数的金额字段值.
理想情况下,查询应返回memberId和总金额,每个成员一行,以便我可以删除过滤器并为所有成员执行.
非常感谢您提供帮助!马丁
PS我已经在arangodb网站上完成了AQL教程,并查看了手册,但真正帮助我的是加载更多示例查询来查看.如果有人知道这样的资源或者想要分享他们自己的资源,那就非常有帮助.干杯!
编辑:第一次读错了问题。第一个可以在edit历史中看到,因为它也包含一些提示:
我通过创建一些这种格式的文档(有些仅包含一项)来复制您的数据:
{
"memberId": "40289",
"items": [
{
"amount": 50,
"description": "some description"
},
{
"amount": 500,
"description": "some description"
}
]
}
Run Code Online (Sandbox Code Playgroud)
基于其中一些类型的文档,您的非汇总查询确实应该如下所示:
FOR m IN pkg_spp_RegMem
FILTER m.memberId == "40289"
COLLECT member = m.memberId INTO g
RETURN { "memberId" : member, "amount" : g[*].m[*].items }
Run Code Online (Sandbox Code Playgroud)
返回的数据:
[
{
"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"
}
]
]
}
]
Run Code Online (Sandbox Code Playgroud)
基于非汇总版本,您需要循环遍历由collect 函数生成的组的项目并SUM()在那里进行操作。为了能够对项目进行求和,您必须FLATTEN()在汇总它们之前将它们放入一个列表中。
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
)
)
)
}
Run Code Online (Sandbox Code Playgroud)
这导致:
[
{
"memberId": "40289",
"amount": 1250
}
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2082 次 |
| 最近记录: |