2015-09-25 25 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