我有一个带有分区键的 DynamoDB 表,userID
没有排序键。该表timestamp
在每个项目中也有一个属性。我想检索在指定范围内具有时间戳的所有项目(无论userID
ie 跨越所有分区)。在阅读文档并搜索 Stack Overflow(此处)后,我发现我需要为我的表创建一个 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,而无需对分区键提供任何条件。请帮助我了解我的实施有什么问题。谢谢。
编辑:阅读此处的线程后,事实证明我们无法查询只有排序键范围的 GSI。那么,如果有的话,通过对属性的范围查询来查询整个表的替代方法是什么?我在该线程中发现的一个建议是使用 year 作为分区键。如果所需的范围跨越多年,这将需要多次查询。此外,这不会将数据均匀地分布在所有分区中,因为只有与当前年份对应的分区将用于插入一整年。请提出任何替代方案。