【问题标题】:How to query and order on two separate sort keys in DynamoDB?如何在 DynamoDB 中的两个单独的排序键上查询和排序?
【发布时间】:2020-10-27 15:15:16
【问题描述】:
GROUPS
    userID: string
    groupID: string
    lastActive: number
    birthday: number

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

partition key: userID
sort key: groupID

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

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

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

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

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案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

    【讨论】:

    • 您不仅回答了我的问题,还回答了我期待的后续问题。我想只有直接的解决方法是在客户端过度查询和过滤,或者使用像 Algolia 或 Elasticsearch 这样的搜索引擎......可爱。
    • 是的,在 DDB 中搜索并不好玩。前面 DDB 上的 Elasticsearch 是一个常见的解决方案。但是ES并不便宜。极光可能会更好看。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2016-09-05
    相关资源
    最近更新 更多