3

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]にプッシュするようなものです

4

1 に答える 1

4

FLATTEN実際に動作するはずです。デフォルトでは、アイテムは最初のレベルでのみ折りたたまれますが、折りたたむレベルの数について追加の引数を与えることができます。

たとえば、次のように、より深くネストされた構造のレベル 3 で使用できます。

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

これにより、すべてのアイテムとサブアイテムがフラットな配列で返されます。つまり、

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

あなたが投稿した特定のクエリ例では、ドキュメントごとに個別に呼び出されるFLATTENため、次のような使用は機能しません。FLATTENproduct

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 に答える