在数字范围内查询dynamodb表中的项目

时间:2019-01-17 00:58:27

标签: nosql amazon-dynamodb dynamodb-queries

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

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

但是我了解到布尔哈希键是完全反模式的,因为它们会将文档压缩在单个分区中。

是否有其他模型可以让我们查询数字范围内的表中的所有项目?

1 个答案:

答案 0 :(得分:1)

我假设您要查询给定用户的未读消息,因为(再次)我假设给定通知的已读/未读状态对于一个用户不应该更改,如果另一个用户读取了一个通知同样的事情。

根据该假设,您应该使用sparse index,将userId(或等效值)用作哈希键,并将unreadNotificationTime作为排序键。在表中插入新通知时,将unreadNotificationTime的值设置为通知的时间戳。用户阅读通知后,请从项目中删除unreadNotificationTime属性。

为什么这样做?

DynamoDB仅要求一个项目具有基表的键属性,而其他任何属性都是可选的。索引在DynamoDB中的工作方式是,基表中的项目将仅出现在具有该特定索引的所有关键属性的项目的索引中。

通过在存储通知时为unreadNotificationTime设置一个值,所有新创建的通知将自动填充到未读邮件索引中。通过在阅读消息时删除unreadNotificationTime,可以从该索引中获得通知。使用这种架构,无需进行任何过滤或扫描操作。您的索引将仅包含未读的通知,按userId分组并按日期排序的通知。