如何在DynamoDB中对两个单独的排序键进行查询和排序?

时间:2020-10-27 15:15:16

标签: amazon-dynamodb

GROUPS
    userID: string
    groupID: string
    lastActive: number
    birthday: number

假设我有一个称为GROUPS的DynamoDB表,该表存储具有这些属性的项目。该表记录了哪些用户加入了哪些组。用户可以同时处于多个组中。因此,复合主键通常是:

partition key: userID
sort key: groupID

但是,如果我想查询特定组中在特定生日范围内(按lastActive排序的所有用户),是否可以创建索引?< / strong>

我可以合成lastActiveuserID来创建合成的排序键,如下所示:

GROUPS
    groupID: string
    lastActiveUserID: string (i.e. "20201230T09:45:59-abc123")
    birthday: number

将使用不同的复合主键,其中分区键为groupID,排序键为lastActiveUserID,它将按参与者上次活动的时间对其排序,然后按二级索引进行排序按生日过滤?

1 个答案:

答案 0 :(得分:1)

按照书面规定,这是不可能的。

在特定的生日范围内

暗示sk_birthday between :start and :end

按lastActive排序

将lastActive表示为排序键。

这是互斥的...我无法设计出能够以可用格式包含两个值的排序键。

您可能有一个全球二级索引,其哈希键为group-idlastActive作为排序键,然后在生日时进行过滤。但是,这只会影响返回的数据,不会影响读取的数据或读取该数据的成本。此外,由于DDB一次仅读取 1MB数据,因此,如果给定组的成员价值超过1MB,则必须循环循环调用它。

此外,当索引具有与表不同的分区(哈希)键时,即为全局二级索引(GSI)。如果您的索引与表具有相同的分区键,但排序键不同,则可以使用本地二级索引(LSI)来完成

但是,对于任何给定的查询,您只能使用表或给定的索引。您不能同时使用多个索引

现在已经这么说了,“特定生日范围” 对您的确切含义是:如果该范围是一个定义的时间段(按月,按周)。也许您可以拥有一个GSI,其中哈希键为"group-id#birthday-period",排序键为lastActive

例如,“给我下个月的GROUPA生日”
查询(hs =“ GROUPA#NOVEMBER”)

但是,如果您想要11月和12月,则必须进行两次查询,然后对结果进行合并和排序。

有效和有效地使用DDB意味着避免使用Scan()并避免使用filterExpressions,而您知道这些git init git fetch https://git.xyz.com/myrepo/app.git 会丢弃大量读取的数据。