我有一个单表设计,我有聊天室(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表示为分页参数