3

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

所以我想返回以下过滤列表:(我们称之为列表 [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 并且没有运气。也许我没有准确地使用功能。我最初的想法是重新打包列表 [A] 中的项目以创建列表 [B],如果不在 [B] 中,则将 [A] 推入 [B]

4

1 回答 1

4

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
)
于 2015-09-25T11:17:30.637 回答