首页 文章

使用AQL在arangodb中进行聚合

提问于
浏览
5

我正在使用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'对象 . 从查询/结果中可以看出,每个对象都有一个名为“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和总金额,每个成员一行,以便我可以删除过滤器并为所有成员执行 .

非常感谢您提供帮助!马丁

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

1 回答

  • 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
      }
    ]
    

相关问题