【问题标题】:Dynamo DB, How do you query everything AND leverage sort keyDynamodb,您如何查询所有内容并利用排序键
【发布时间】:2018-06-01 09:43:21
【问题描述】:

我已经设置了一个索引,其中第二个排序键设置为我想要的(整数时间戳)。 API 一直抱怨我没有给它一个 KeyConditionExpression。然后,如果我给它一个,它说必须指定 id。我试过强迫它使用 id null 给我所有东西,但它仍然不会这样做。这甚至可能吗?如果它不能完成这个完全简单的任务,也许是时候摆脱发电机了。

看在上帝的份上,我要做的就是查询整个表并让它使用我的排序键。我会在几小时前使用 SQL 进行此操作..

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    事实证明,您还可以将 IndexName 添加到扫描中。这有帮助。此外,如果您使用排序键创建索引,则所有主索引必须相同才能进行排序。

    【讨论】:

    • IndexName 所做的只是从索引而不是表中返回项目。
    【解决方案2】:

    首先,DynamoDB 是一个 NOSQL 数据库,所以它故意不是 SQL。也许您不应该期望能够执行您习惯的类似 SQL 的查询,并且因为这是两种完全不同类型的数据库,每种都有其优点和缺点而感到沮丧。

    DynamoDB 中的记录使用哈希键进行分区,并且可以选择在每个分区内进行排序。 应该选择散列键,以便项目尽可能均匀地分布在分区上。分区的使用使 DynamoDB 具有极强的可扩展性和快速性。但是,如果您需要扫描所有项目并按排序顺序获取它们,那么您可能使用了错误的工具来完成这项工作,或者您需要在客户端对项目进行排序.

    扫描操作将简单地遍历所有分区,返回每个分区的所有项目。此时,项目只能在各自的分区内进行排序。

    例如,假设一组数据被分成 3 个分区:

    Partition A                Partition B                Partition B
    
    Sort key                   Sort key                   Sort key
    A                          D                          C
    C                          E                          K
    P                          G                          L
    

    如您所见,您可以轻松查询每个分区并按排序顺序获取其中的项目。但是,如果您扫描,您可能会将项目排序为 [A, C, P, D, E, G, C, K, L],如果排序顺序完全是确定性的。此时,您必须自己对项目进行排序。

    有时看到的“技巧”是对所有项目使用具有相等值的“虚拟”哈希键,就像您在自己的答案中提到的那样。这样您就可以查询“dummy = 1”并根据排序键对项目进行排序。但是,这完全违背了哈希键的目的,因为所有项目都将放在同一个分区中,因此根本不会使表扩展。但是,如果您发现自己在使用 DynamoDB,即使您有一个非常小的数据集,那么无论如何它都可以工作。但同样,对于这样的小数据集和用例,您可能应该首先使用其他工具,例如 RDS。

    【讨论】:

      【解决方案3】:

      只是为了详细说明@JHH。一般来说,我会说他是正确的,您不需要对 DynamoDB 中的所有元素进行排序。我也有与此类似的要求,因为我需要获取顶部的 N 元素数量,这些元素可能都在不同的分区中。

      DynamoDB 确实有办法做到这一点,但它并不是开箱即用的。我不认为说你应该需要一个 SQL 数据库是正确的,因为可以说你永远不会使用 NoSQL 数据库,因为你总是会有这些限制之一。此外,如果您只将 NoSQL 用于大型数据集,那么您以后总是需要重新设计您的应用程序。

      那该怎么办?好吧,您确实有一些选择,这取决于您的用例,让我们假设您至少在分区内进行了排序,这使得它更容易。我们还假设您正在寻找最大值。

      • 最简单的方法是从每个分区中获取第一个值。并找到最大值。如果您需要说出前 10 个值,您仍然可以使用此策略,但会变得过于复杂。
      • 下一个选项是使用 DynamoDB 流。假设我们要保留前 100 个元素的列表。这些将准备好并等待它们自己的最高值分区,排序并准备好即时检索。您需要自己维护此列表,方法是检查何时插入或更新项目,它们是否大于第 100 个元素。如果是这种情况,您会将元素插入到最高值分区中,并删除最后一个值。我认为这是解决这个问题的最有可能的方法。

      因此,在 NoSQL 中,如果有某种查询,您会很乐意这样做,这在 SQL 中非常简单,而且您不能使用 Table/GSI/LSI,那么您几乎需要手动计算结果,并且准备好食用。

      现在,如果您不打算经常使用这些顶部值,那么您可能会使用第一种方法,并扫描每个分区的顶部值,直到获得您想要的列表,但这取决于值的多少分散在分区中,这可能需要很多容量单位。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        相关资源
        最近更新 更多