Элементы запроса в таблице Dynamodb в числовом диапазоне

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

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

Но я узнал, что булевы хеш-ключи - это довольно антипаттерн, поскольку они сжимают документы в одном разделе.

Есть ли другая модель, которая позволила бы нам запрашивать все элементы в таблице в пределах числового диапазона?


person Daniel Birowsky Popeski    schedule 17.01.2019    source источник
comment
вы пробовали FilterExpression в scan?   -  person IftekharDani    schedule 17.01.2019
comment
@IftekharDani Я хочу запросить таблицу, а не сканировать ее.   -  person Daniel Birowsky Popeski    schedule 17.01.2019


Ответы (1)


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

Исходя из этого предположения, вы должны использовать разреженный индекс с userId (или эквивалентным) в качестве хэш-ключа и unreadNotificationTime в качестве ключа сортировки. Когда вы вставляете новое уведомление в свою таблицу, установите значение unreadNotificationTime для отметки времени для уведомления. Когда пользователь прочитает уведомление, удалите атрибут unreadNotificationTime из элемента.

Почему это работает?

DynamoDB требует только, чтобы элемент имел ключевые атрибуты базовой таблицы, а любые другие атрибуты необязательны. Индексы работают в DynamoDB так, что элемент из базовой таблицы будет отображаться только в индексе элемента, имеющего все ключевые атрибуты этого конкретного индекса.

Если установить значение unreadNotificationTime при сохранении уведомления, все вновь созданные уведомления будут автоматически помещаться в индекс непрочитанных сообщений. Удалив unreadNotificationTime при чтении сообщения, вы получите уведомление из этого индекса. С этой схемой нет необходимости в каких-либо операциях фильтрации или сканирования. Ваш индекс будет содержать только непрочитанные уведомления, сгруппированные по userId и отсортированные по дате.

person Matthew Pope    schedule 21.01.2019