我想在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]
答案 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
)