【问题标题】:Querying DynamoDB查询 DynamoDB
【发布时间】:2013-10-30 10:00:50
【问题描述】:

我有一个 DynamoDB 表,其中包含一个字母数字字符串作为哈希键(例如“d4ed6962-3ec2-4312-a480-96ecbb48c9da”)。我需要根据表中的另一个字段来查询表,因此我需要我的查询来选择所有键,例如我的字段 x 在 dat x 和 date y 之间。

我知道我需要哈希键上的条件和范围键上的另一个条件,但是我很难编写一个不将我的查询绑定到特定 ID 的哈希键条件。

我以为我可以摆脱基于 ID 为 NOT_NULL 的冗余条件,但是当我使用它时,我得到了错误:

不支持查询键条件

以下是我使用的条件,知道如何实现这个目标吗?

 Condition hashKeyCondition = new Condition()
 .withComparisonOperator(ComparisonOperator.NOT_NULL.toString());

Condition rangeCondition = new Condition()
.withComparisonOperator(ComparisonOperator.BETWEEN.toString())
.withAttributeValueList(new AttributeValue().withS(dateFormatter.print(lastScanTime())), 
new AttributeValue().withS(dateFormatter.print(currentScanTime)));

Map<String, Condition> keyConditions = new HashMap<String, Condition>();
keyConditions.put("userId", hashKeyCondition);
keyConditions.put("lastAccesTime", rangeCondition);

在此先感谢大家的帮助。

【问题讨论】:

    标签: java amazon-web-services conditional-statements amazon-dynamodb


    【解决方案1】:

    在 DynamoDB 中,您可以通过 3 个 api 获取项目:

    Scan(灵活但昂贵),

    Query(不太灵活:您必须指定一个哈希,但成本较低)

    GetItem(按哈希,如果您的表有一个,按范围)

    实现您想要的唯一方法是:

    1. 使用 Scan,速度慢或成本高。

    2. 使用另一个表 (B) 作为前一个 (A) 的索引,例如:

      B.HASH = '值' B.RANGE = 用户 ID
      B.lastAccesTime = lastAccesTime(带有二级索引)

    现在您必须在写入时维护该索引,但您可以将它与 Query 操作一起使用, 获取您的用户 ID。查询B:hash='VALUES', lastaccessTime between x and y, select userid.

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      NOT_NULL 比较运算符对哈希键条件无效。查询中哈希键条件的唯一有效运算符是 EQ。更多信息可以在这里找到: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

      这意味着查询将不起作用,至少在您的表当前构建时如此。您可以使用 Scan 操作,也可以创建一个单独的表来按日期(哈希)和用户 ID(范围)存储数据。

      祝你好运!

      【讨论】:

        【解决方案3】:

        我最终扫描了表格并执行了过滤器。

        感谢大家花时间提供帮助!

        【讨论】:

        • 如果您需要这样做,那么 DynamoDB 不是适合您情况的解决方案。如果您有少量记录,那么关系数据库对您来说会更好。如果您有大量记录,则此全表扫描将非常低效且昂贵。
        【解决方案4】:

        您可以添加全局二级索引,例如,您的日期的年份和月份,并使其成为您的哈希键,该索引的范围键将是您的日期,然后您可以查询某个月份的任何数据范围。它将帮助您避免昂贵的全扫描。

        例如

        全球二级指数:
        哈希键:month_and_year 例如'2014 March'
        范围键:full_date

        希望对您有所帮助!

        【讨论】:

          【解决方案5】:

          如果要查询分区键以外的查询,则需要创建 GSI。扫描在成本和性能方面非常昂贵。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多