4

我有一个 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);

在此先感谢大家的帮助。

4

5 回答 5

6

在 DynamoDB 中,您可以使用 3 个 api 获取项目:

. 扫描(灵活但昂贵),

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

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

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

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

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

    B.HASH = 'VALUES' B.RANGE = userid
    B.lastAccesTime = lastAccesTime(带有二级索引)

现在您必须在写入时维护该索引,但您可以将它与 Query 操作一起使用,以获取您的 userId。查询B:hash='VALUES',x和y之间的lastaccessTime,选择userid。

希望这可以帮助。

于 2013-10-22T12:40:45.670 回答
2

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

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

祝你好运!

于 2013-10-22T19:10:27.963 回答
2

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

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

于 2013-10-22T21:22:28.837 回答
0

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

例如

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

希望对您有所帮助!

于 2014-03-18T02:23:42.963 回答
0

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

于 2017-06-27T12:07:32.000 回答