Групповой запрос Arangodb с подкачкой - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть база данных продуктов в коллекции arangodb, в которой продукт имеет несколько размеров. Проблема в том, что для каждого размера один и тот же товар повторяется. Но у каждого продукта есть общий номер группы. Например:

{"name": "product1", "description": "someDescription", size: 5, groupNumber: 12}
{"name": "product1", "description": "someDescription", size: 15, groupNumber: 12}
{"name": "product1", "description": "someDescription", size: 25, groupNumber: 12}
{"name": "product1", "description": "someDescription", size: 35, groupNumber: 12}

{"name": "product2", "description": "someDescription", size: 5, groupNumber: 11}
{"name": "product2", "description": "someDescription", size: 15, groupNumber: 11}
{"name": "product2", "description": "someDescription", size: 25, groupNumber: 11}
{"name": "product2", "description": "someDescription", size: 35, groupNumber: 11}

Теперь мне нужно отобразить список продуктов (на веб-странице), но каждый продукт должен отображаться только один раз с размерами в массиве для каждого продукта, например:

product1 someDescription sizes: 5,15,25,35
product2 someDescription sizes: 5,15,25,35
...

Каждая страница должна содержать до 25 товаров. Интересно, как это сделать с помощью arangodb и возможно ли это вообще?

1 Ответ

2 голосов
/ 13 февраля 2020

О первой проблеме, группирующей ваши продукты, которая может быть решена с помощью COLLECT. Предполагая, что вы получаете ваши продукты из коллекции col, вы можете написать

FOR doc IN col
COLLECT groupNumber = doc.groupNumber, name = doc.name, description = doc.description INTO sizes = doc.size
RETURN CONCAT(name, " ", description, " sizes: ", CONCAT_SEPARATOR(",", sizes))

.

С вашими примерами это дает

[
  "product2 someDescription sizes: 5,15,25,35",
  "product1 someDescription sizes: 5,15,25,35"
]

. Возможно, вы захотите добавить оператор SORT после COLLECT, чтобы получить желаемый порядок.

Чтобы перейти ко второй проблеме, например, нумерации страниц, используйте LIMIT. Например,

FOR doc IN col
COLLECT groupNumber = doc.groupNumber, name = doc.name, description = doc.description INTO sizes = doc.size
LIMIT @offset, 25
RETURN CONCAT(name, " ", description, " sizes: ", CONCAT_SEPARATOR(",", sizes))

и задайте для параметра привязки offset значение 0 для извлечения первой страницы, 25 для второй и т. Д.

Если вы хотите динамически c размер страницы, просто замените LIMIT @offset, 25 на LIMIT @offset, @limit и добавьте дополнительный параметр связывания.

...