6

我正在使用 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,因为它显然无法在扩展的项目列表中找到一个名为 amount 的字段。

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

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

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

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

4

1 回答 1

4

编辑:第一次误读了这个问题。第一个可以在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
  }
]
于 2014-06-10T01:03:53.237 回答