AQL返回平面合并列表

时间:2015-09-25 10:03:40

标签: arangodb aql

我想在AQL中返回一个唯一的产品选项列表,我知道COLLECT可以返回唯一列表,但是,我现在如何将其展平为数组。

所以我想返回以下过滤列表:(让我们称之为列表[A])

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

as :(让我们调用此列表[B])

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

用于获取列表[A]

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

我试过FLATTEN,UNIQUE而且没有运气。也许我没有准确地使用函数。我最初的想法是重新打包列表[A]中的项目以创建列表[B]类似于将[A]推入[B],如果不是[B]

1 个答案:

答案 0 :(得分:3)

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
)