Amazon dynamodb 如何在DynamoDB中查询和排序两个单独的排序键?

Amazon dynamodb 如何在DynamoDB中查询和排序两个单独的排序键?,amazon-dynamodb,Amazon Dynamodb,假设我有一个名为GROUPS的DynamoDB表,它存储具有这些属性的项。该表记录了哪些用户加入了哪些组。用户可以同时处于多个组中。因此,复合主键通常为: GROUPS userID: string groupID: string lastActive: number birthday: number 但是,如果我想查询特定组中的所有用户,在特定的生日范围内,按lastActive排序,这可能吗?如果可能,我需要创建什么索引? 我是否可以合成lastActive

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

GROUPS
    userID: string
    groupID: string
    lastActive: number
    birthday: number
但是,如果我想查询特定组中的所有用户,在特定的生日范围内,按
lastActive
排序,这可能吗?如果可能,我需要创建什么索引?

我是否可以合成
lastActive
userID
来创建一个合成排序键,如下所示:

partition key: userID
sort key: groupID

这将产生一个不同的复合主键,其中分区键是
groupID
,排序键是
lastActiveUserID
,它将根据参与者上次活动的时间对参与者进行排序,然后根据生日筛选二级索引?

如文所述,不可能

在特定的生日范围内

暗示:开始和结束之间的
sk_生日

按lastActive排序

表示lastActive作为排序键

它们是相互排斥的…我无法设计一个排序键,它能够以可用的格式包含这两个值

您可以有一个全局二级索引,其哈希键为
group id
,而
lastActive
作为排序键,然后在生日筛选。但是,这只会影响返回的数据,不会影响读取的数据或读取该数据的成本。此外,由于DDB一次只能读取1MB的数据,如果给定组的成员可能超过1MB,则必须在循环中重复调用它

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

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

说了这么多,如果“特定的生日范围”是一个定义的周期,按月、周,那么你认为“特定的生日范围”到底是什么意思呢。也许您可以使用一个GSI,其中散列键为
“组id#生日期”
,排序键为
lastActive

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

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


有效和高效地使用DDB意味着避免使用
Scan()
filterExpressions
,因为您知道这会浪费大量读取的数据。

您不仅回答了我的问题,而且还回答了我期待的后续问题。我想只有在客户端过度查询和过滤,或者使用像Algolia或Elasticsearch这样的搜索引擎,才能立即解决问题。。。可爱。是的,在DDB中搜索并不有趣。DDB前端的Elasticsearch是一种常见的解决方案。但这并不便宜。极光可能更适合观察。
GROUPS
    groupID: string
    lastActiveUserID: string (i.e. "20201230T09:45:59-abc123")
    birthday: number