Я предполагаю, что вы хотите запросить непрочитанные сообщения для данного пользователя, поскольку (опять же) я предполагаю, что состояние чтения / непрочитанного данного уведомления не должно изменяться для одного пользователя, если другой пользователь читает уведомление для тоже самое.
Исходя из этого, вы должны использовать разреженный индекс с userId
(или его эквивалентом) в качестве хеш-ключа и unreadNotificationTime
в качестве ключа сортировки. Когда вы вставляете новое уведомление в вашу таблицу, установите значение unreadNotificationTime
для отметки времени для уведомления. Когда пользователь прочитал уведомление, удалите атрибут unreadNotificationTime
из элемента.
Почему это работает?
DynamoDB требует только, чтобы элемент имел ключевые атрибуты базовой таблицы, а любые другие атрибуты являются необязательными. Работа индексов в DynamoDB заключается в том, что элемент из базовой таблицы будет отображаться только в индексе элемента, имеющего все ключевые атрибуты этого конкретного индекса.
При установке значения для unreadNotificationTime
при сохранении уведомления все вновь созданные уведомления будут автоматически заполняться индексом непрочитанных сообщений. Удаляя unreadNotificationTime
при прочтении сообщения, вы получаете уведомление из этого индекса. С этой схемой нет необходимости в каких-либо операциях фильтрации или сканирования. Ваш индекс будет содержать только непрочитанные уведомления, сгруппированные по идентификатору пользователя и отсортированные по дате.