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