查询 dynamodb table 中某个数值范围内的项目

Query items in dynamodb table within a numeric range

我需要一些指导来实现新聊天消息的邮件通知。邮件通知将通知用户前一小时内有新消息的所有聊天。

为了完成它,我需要在一个时间间隔内查询 table 中的所有聊天记录。首先想到的是添加新的全局索引,其中哈希值是表示聊天是否有未读消息的布尔值,范围是该聊天中最新消息的时间戳。

但我了解到布尔散列键是非常反模式的,因为它们会将文档压缩在一个分区中。

是否有不同的模型可以让我们在一个数值范围内查询 table 中的所有项目?

我假设您想查询给定用户的未读消息,因为(再次)我假设给定通知的 read/unread 状态不应该为一个用户改变,如果另一个用户读取同一事物的通知。

继续这个假设,您应该使用 sparse indexuserId(或等效)作为散列键,unreadNotificationTime 作为排序键。当您将新通知插入 table 时,将 unreadNotificationTime 的值设置为通知的时间戳。当用户阅读通知后,从项目中删除 unreadNotificationTime 属性。

为什么这样做?

DynamoDB只要求item有基础table的关键属性,其他属性可选。索引在 DynamoDB 中的工作方式是来自基 table 的项目只会出现在该项目的索引中,该项目具有该特定索引的所有键属性。

通过在存储通知时设置 unreadNotificationTime 的值,所有新创建的通知将自动填充到未读消息索引中。通过在阅读消息时删除 unreadNotificationTime,您将收到来自该索引的通知。使用此架构,无需任何过滤或扫描操作。您的索引将仅包含未读、按 userId 分组并按日期排序的通知。