【问题标题】:AQL return flat merged listAQL 返回平面合并列表
【发布时间】:2015-09-26 03:49:58
【问题描述】:

我想在 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],如果不在 [B] 中,则将 [A] 推入 [B]

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    FLATTEN 应该确实有效。默认情况下,它只会折叠第一层的项目,但可以为折叠的层数提供一个额外的参数。

    例如,您可以将它与级别 3 一起用于嵌套更深的结构,如下所示:

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

    这将返回一个平面数组中的所有项目和子项目,即

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

    在您发布的特定示例查询中,像下面这样使用FLATTEN 将不起作用,因为每个product 文档都会单独调用FLATTEN

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

    因此它不会生成单个折叠的数组,而是生成多个深度为 1 的已折叠数组。

    要从所有 product 文档创建折叠数组,可以在 FOR 循环之外应用 FLATTEN

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

    【讨论】:

    • FOR product IN products COLLECT options = product.options[*].option FILTER LENGTH( options ) > 0 RETURN FLATTEN( options ) 或 RETURN FLATTEN( options , 3 ) 返回相同的结果
    • 注意到您使用的示例数组与我的输出不相似 [["Size"],["Size","Color"], ["value"]]
    • 我使用了一个更加嵌套的数组作为FLATTEN 的示例用例。它适用于任意数量的嵌套级别。
    • 区别以及为什么它不适用于特定查询是FLATTEN 将在一个数组上工作,但您使用的查询是为每个找到的product 文档生成一个数组。所以会有多个FLATTEN 的调用,每个都在一个单独的数组上,所以FLATTEN 没有机会将它们折叠成一个数组。我将更新我的答案,以便考虑从此类基于集合的查询中收集数据。
    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多