gpt4 book ai didi

arangodb - 使用 AQL 在 arangodb 中聚合

转载 作者:行者123 更新时间:2023-12-04 15:22:31 24 4
gpt4 key购买 nike

我正在尝试使用 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 }

这将返回以下结果:
[
{
"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”对象。从查询/结果中可以看出,每个对象都有一个称为“项目”的较小对象列表,每个项目都有一个数量和一个描述。

我想按成员 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,因为它显然在展开的项目列表中找不到名为数量的字段。

查看结果我可以理解为什么:返回的结果使得项目实际上是一个列表,具有数量/描述的对象列表。但我不明白如何正确引用或扩展未命名列表以返回 SUM() 函数的金额字段值。

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

如果您能提供帮助,非常感谢!
马丁

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

最佳答案

编辑:第一次误读了这个问题。第一个可以在 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()那里。
为了能够对项目求和,您必须 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
)
)
)
}

这导致:
[
{
"memberId": "40289",
"amount": 1250
}
]

关于arangodb - 使用 AQL 在 arangodb 中聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24130508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com