2015-09-25 8 views
3

Я хочу вернуть уникальный список параметров продукта в AQL, я понимаю, что COLLECT может возвращать уникальный список, однако, как я теперь сглаживаю его в массив.AQL возвращать плоский объединенный список

Так что я хочу вернуть следующий отфильтрованный список: (позволяет назвать это список [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], например, нажать [A] на [B], если не в [B]

ответ

2

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 
) 
+0

для продукта в продуктах Collect опции = product.options [*] опция Длина фильтра (опции)> 0 вОЗВРАТ сплющить (опции) или RETURN сплющить (варианты, 3) возвращает то же самое Результаты – iswak

+0

Записанный массив примеров, который вы использовали, не похож на вывод У меня есть [["Размер"], ["Размер", "Цвет"], ["значение"]] – iswak

+0

Я использовал еще более вложенный массив в качестве примера case для 'FLATTEN'. Он будет работать с любым количеством уровней вложенности. – stj