【问题标题】:Query items in dynamodb table within a numeric range查询dynamodb表中数值范围内的项目
【发布时间】:2019-01-17 00:58:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您在scan 中尝试过FilterExpression 吗?
  • @IftekharDani 我想查询表,而不是扫描它。

标签: nosql amazon-dynamodb dynamodb-queries


【解决方案1】:

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

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

为什么会这样?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多