Как запросить данные в AWS AppSync в определенном диапазоне, а затем отсортировать результаты по другому ключу? - PullRequest
0 голосов
/ 09 ноября 2018

Я создаю имя храма BlogAuthor в AWS DynamoDB со следующей структурой:

authorId | orgId | age |name

Позже мне нужно сделать такой запрос: get all authors from organization id = orgId123 with age between 30 and 50, then sort their name in alphabet order.

Я не уверен, что такой запрос можно выполнить в DynamoDB (позже я применю его в AppSync), поэтому первое решение - создать индекс (GSI) с partitionKey=orgId, sortKey=age (окончательное имя orgId-age-index). Но затем, когда вы пытаетесь выполнить запрос в DynamoDB, задайте partitionKey orgId = orgId123, sortKey age = [30; 50] и фильтра нет; тогда я могу иметь список авторов. Однако невозможно отсортировать этот список по запросу name из приведенного выше запроса.

Я повторяю другое решение, создавая новый индекс с partitionKey=orgId и sortKey=name. Затем выполните запрос (не сканирование) в DynamoDB с помощью partitionKey orgId = orgId123, установите пустое значение sortKey (потому что мы хотим сортировать только по имени вместо получения определенного имени) и отфильтруйте age в диапазоне [30; 50]. Это решение кажется работающим, однако я замечаю, что фильтр применяется к списку результатов - например, к списку результатов с 100 элементами, но после применения фильтра по возрасту может остаться до 70 элементов или ничего. Но я всегда надеюсь, что он вернет 100 предметов.

Не могли бы вы сказать мне, что-то не так с моими подходами? Или можно сделать такой запрос в DynamoDB?

Другой (маленький) вопрос - когда подключить эту таблицу к API-интерфейсу AppSync: если такой запрос выполнить невозможно, то такой запрос также не возможен в AppSync?

1 Ответ

0 голосов
/ 10 ноября 2018

Вы не сможете делать все, что хотите, в одном запросе DynamoDB.

Вариант 1:

Вы можете делать то, что хотите, если вы можете сортировать объекты на клиенте. Это будет работать для организаций с относительно небольшим количеством людей.

Плюсы:

Позволяет эффективно запрашивать пользователей в определенной организации между различными пользователями.

Минусы:

Результаты не сортируются по имени на сервере.

Вариант 2:

Плюсы:

Позволяет разбивать на страницы пользователей в организации, упорядоченных по имени.

Минусы:

Вы не можете эффективно получить всех пользователей в организации в возрасте. Вы бы эффективно сканировали индекс, и вам потребовалось бы несколько вызовов в оба конца.

Вариант 3:

Третий вариант - поток информации из DynamoDB в ElasticSearch с использованием потоков DynamoDB и AWS Lambda. Как только данные в Elasticsearch, вы можете выполнять гораздо более сложные запросы. Вы можете увидеть больше информации об API поиска Elasticsearch здесь https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html.

Плюсы:

Гораздо более мощный механизм запросов.

Минусы:

Дополнительные издержки с потоком DynamoDB и функцией AWS Lambda.

...