【发布时间】:2021-03-30 02:58:13
【问题描述】:
我有一个分区键为userID 且没有排序键的 DynamoDB 表。
该表在每个项目中还有一个timestamp 属性。我想检索时间戳在指定范围内的所有项目(不管userID,即跨越所有分区)。
在阅读文档并搜索 Stack Overflow (here) 后,我发现我需要为我的表创建一个 GSI。
因此,我使用以下键创建了一个 GSI:
- 分区键:
userID - 排序键:
timestamp
我正在使用以下代码通过 Java SDK 查询索引:
String lastWeekDateString = getLastWeekDateString();
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
DynamoDB dynamoDB = new DynamoDB(client);
Table table = dynamoDB.getTable("user table");
Index index = table.getIndex("userID-timestamp-index");
QuerySpec querySpec = new QuerySpec()
.withKeyConditionExpression("timestamp > :v_timestampLowerBound")
.withValueMap(new ValueMap()
.withString(":v_timestampLowerBound", lastWeekDateString));
ItemCollection<QueryOutcome> items = index.query(querySpec);
Iterator<Item> iter = items.iterator();
while (iter.hasNext()) {
Item item = iter.next();
// extract item attributes here
}
执行此代码时出现以下错误:
Query condition missed key schema element: userID
据我所知,我应该能够仅使用排序键来查询 GSI,而无需对分区键提供任何条件。请帮助我了解我的实施有什么问题。谢谢。
编辑: 在阅读了here 的线程后,我们发现我们无法查询只有排序键范围的 GSI。 那么,如果有的话,还有什么替代方法可以通过对属性的范围查询来查询整个表? 我在该线程中发现的一个建议是使用 year 作为分区键。如果所需的范围跨越多年,这将需要多次查询。此外,这不会将数据均匀地分布在所有分区中,因为只有与当前年份对应的分区将用于插入一整年。请提出任何替代方案。
【问题讨论】:
标签: amazon-web-services amazon-dynamodb aws-java-sdk aws-java-sdk-dynamodb