DynamoDB查询与GT和begins_with排序键?



我有一个单表设计,我有聊天室(PK)与时间戳消息(SK)。由于它是一个单表设计,SK有一个MSG#前缀,后面跟着消息创建时间戳,以保持消息实体与其他实体的分离。

我想检索特定时间戳之后的所有消息。看起来关键条件应该是PK = "<ChatRoomId>" AND begins_with(SK, "MSG#") AND SK GT "MSG#<LastRead>"。SK条件的第一部分是只获取消息实体,第二部分是只获取新消息。排序键是否可能有这样的双重条件?这似乎是可能的,因为它表示一个连续的排序键范围。

您可以通过使用between:

PK = "<ChatRoomId>" AND SK BETWEEN "MSG#<YourDate>" AND "MSG#9999-99-99"

这样,您将获得从<YourDate>开始的所有消息,而没有其他前缀的记录。这将有效,除非你计划非常遥遥领先。

我有完全相同的用例,并找到了这个答案,感谢这个建议,它有效,但我们决定进一步研究- "是包含的,我们必须要么浪费一个读容量单位,要么编造一个假值作为解决方案。

原来,DynamoDB API提供了这个特性,它是唯一的开始键:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-request-ExclusiveStartKey

无可否认,文档并不是很令人鼓舞,似乎表明参数是一些不透明的数据,您只能通过之前的查询获得:

该操作要求值的第一项的主键。使用上一个操作中LastEvaluatedKey返回的值

但是该键的实际内容非常简单和透明:它是一个像{"PK": {"S": "your_pk"}, "SK": {"S": "exclusive_start_sk"}}的地图(用您的实际键替换PK/SK -如果您正在做单表设计,您可能会使用这些通用名称)。如果您查询的是GSI而不是主表,则可以提供GSIPK/GSISK。您可以执行一些手动查询并观察返回的LastEvaluatedKey,以验证它所期望的内容。

可以将greater_than和begins_with组合在一起,greater_than表示为分页参数

最新更新