2014-06-09 38 views
5

我正在嘗試arangodb中一個相當基本的任務,使用SUM()聚合函數。使用AQL在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" 
     }, 
     ] 
    ] 
    } 
] 

我使用收集到組的業績,因爲給定的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和總金額,每行成員一行,以便我可以刪除過濾器併爲所有成員執行。

非常感謝您提前幫助您! Martin

PS我已經完成了arangodb網站上的AQL教程,並檢查了手冊,但真正幫助我的是加載更多示例查詢來查看。如果有人知道這樣的資源或想分享他們自己的一些資源,「非常有義務。乾杯!

回答

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 
    } 
] 
+0

非常感謝您的幫助!我不知道flatten函數,但在調用它時出現錯誤:「[1540]使用未知函數'FLATTEN()'」。它是用戶定義的嗎?無論如何,我接受你的回答,我可以通過以下方式修改你提供的查詢以獲得所需的結果: FOR m IN pkg_spp_RegMem FILTER m.memberId ==「40289」 COLLECT member = m.memberId INTO g RETURN {「memberId」:member,「amount」:SUM((for r IN g [*]。m [*]。items FOR i IN r RETURN i.amount))} – Martin

+1

[FLATTEN ()](https://docs.arangodb.com/Aql/ArrayFunctions.html)絕對是一個標準的數組函數。從v2.7開始,您還可以使用新的多星運算符:https://www.arangodb.com/2015/06/aql-improvements-for-2-7/ – CoDEmanX