查询DynamoDB

4
我有一个DynamoDB表,其中哈希键是一个字母数字字符串(例如“d4ed6962-3ec2-4312-a480-96ecbb48c9da”)。我需要根据表中的另一个字段查询该表,因此我需要我的查询选择所有键,例如我的字段x在日期x和日期y之间。
我知道我需要在哈希键上设置条件,并在范围键上设置另一个条件,但我很难组成一个不绑定查询到特定ID的哈希键条件。
我曾经认为可以使用基于ID不为空的冗余条件来解决问题,但当我使用它时,我会收到以下错误:
查询键条件不受支持
以下是我正在使用的条件,你有什么想法如何实现这个目标?
 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);

非常感谢所有提供帮助的人。

5个回答

6
在DynamoDB中,您可以使用三个API获取项目:
. 扫描(灵活但昂贵),
. 查询(不太灵活:必须指定哈希,但不太昂贵)
. GetItem(按哈希和(如果表中有)范围获取)
实现您想要的唯一方法是:
1. 使用扫描,速度较慢或昂贵。
2. 使用另一个表(B)作为先前表(A)的索引,例如:
B.HASH = 'VALUES' B.RANGE = userid B.lastAccesTime = lastAccesTime(具有二级索引)
现在你需要在写入时维护该索引,但是可以使用Query操作来获取用户ID。查询B:哈希='VALUES',最后访问时间在x和y之间,选择userid。希望这能帮到你。

2
NOT_NULL比较运算符对于哈希键条件无效。在查询的哈希键条件中,唯一有效的运算符是EQ。可以在此处找到更多信息: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html 这意味着查询将不起作用,至少在当前构建的表中是如此。您可以使用Scan操作或创建一个单独的表,按日期(哈希)和用户ID(范围)存储数据。
祝您好运!

2

最终我扫描了表格并实施了过滤器。

感谢每个人抽出时间帮忙!


如果您需要这样做,那么DynamoDB并不是您情况下的正确解决方案。如果您只有少量记录,那么关系型数据库会更适合您。如果您有大量记录,那么进行全表扫描将非常低效且昂贵。 - bikeman868

0
你可以添加全局二级索引,例如使用日期的年份和月份作为哈希键,该索引的范围键将是你的日期,然后你就可以查询某个月份内的任何数据范围。这将有助于避免昂贵的全表扫描。
例如:
全局二级索引:
哈希键:月份和年份,例如“2014年3月”
范围键:完整日期

希望对你有所帮助!

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接