2015-09-25 61 views
3

我想返回AQL中產品選項的唯一列表,但我明白COLLECT可以返回唯一列表,但我現在該如何將其平鋪到數組中。AQL return flat merged list

所以我想返回以下過濾列表:(讓叫它名單[A])

[ 
    [ 
    "Size" 
    ], 
    [ 
    "Size", 
    "Color" 
    ], 
    [ 
    "value" 
    ] 
] 

爲:(讓我們稱之爲這個名單[B])查詢使用

["Size","Color","Value"] 

獲取列表[A]

FOR product IN products 
    COLLECT options = product.options[*].option 
    FILTER LENGTH(options) > 0 
RETURN options 

我試過FLATTEN,UNIQUE,沒有運氣。也許我沒有準確地使用函數。我最初的想法是重新包裝列表中的物品[B],如果不是在[B]中,將列表[B]中的物品創建爲列表[B],如[B]推入[B]。

回答

2

FLATTEN實際上應該工作。默認情況下,它只會摺疊第一級別的項目,但可以給予摺疊級別數量的額外參數。

例如,你可以用3級上更深層嵌套的結構,使用這樣的:

/* values to flatten */ 
LET values = [[[["Size"]],[["Size","Color"]],["value"]]] 
RETURN FLATTEN(values, 3) 

這將返回所有項目和分項在一個平面陣列,即

[ 
    "Size", 
    "Size", 
    "Color", 
    "value" 
] 

在具體的例子查詢您發佈,使用FLATTEN像如下將無法正常工作,因爲FLATTEN將每個product文件單獨調用:

FOR product IN products 
    COLLECT options = product.options[*].option 
    FILTER LENGTH(options) > 0 
    RETURN FLATTEN(options, 2) 

所以不會產生單一,摺疊陣列,但多個,已經崩潰深度的陣列1.

要創建的所有文檔product摺疊陣列,所述FLATTEN可以在FOR的外部施加循環:

RETURN FLATTEN(
    FOR product IN products 
    COLLECT options = product.options[*].option 
    FILTER LENGTH(options) > 0 
    RETURN options 
) 
+0

FOR產物IN COLLECT選項= product.options [*]選項 濾波器長度(選項)> 0 RETURN FLATTEN(選項)或RETURN FLATTEN產品(選項,3)返回相同的結果 – iswak

+0

您使用的注意示例數組與我的輸出不相似 [[「Size」],[「Size」,「Color」],[「value」]] – iswak

+0

我使用了更多嵌套數組作爲示例'FLATTEN'的情況。它可以處理任意數量的嵌套層次。 – stj