DynamoDB GSI分页查询报错:起始键不匹配范围键谓词
DynamoDB GSI分页报错:The provided starting key does not match the range key predicate 解决思路
以下是针对该问题的具体排查方向和解决方法:
1. 确保两次查询的键条件完全一致
- 分页查询时,第二次查询的
KeyConditionExpression必须和第一次完全相同。比如第一次用了PK = :pk AND SK > :skStart,第二次不能改成PK = :pk AND SK >= :skStart或者其他条件——哪怕只是比较符变化,都会导致ExclusiveStartKey里的SK不符合新的范围规则。 - 检查
ExpressionAttributeValues里的参数值,确保和第一次查询的对应参数(比如:pk)完全一致,没有被修改。
2. 确认ExclusiveStartKey使用的是GSI的主键
- 因为你查询的是GSI,所以
ExclusiveStartKey必须包含GSI定义的PK和SK两个属性,不能用原表的键(原表只有PK)。 - 直接使用SDK返回的
LastEvaluatedKey作为ExclusiveStartKey,不要手动构造。打印这个键的内容,确认它包含GSI的PK和SK,且值对应第一页最后一条数据的GSI键值。
3. 检查SK的格式一致性
- 你的SK是Java Instant的字符串形式,要确保所有数据的SK都是标准的ISO-8601格式(比如
2024-05-20T12:00:00Z):- 避免大小写差异(比如
z代替Z)、额外的空格或字符; - 确认Instant的序列化方式一致,不会出现不同格式的字符串(比如有的带毫秒,有的不带),否则会导致排序逻辑混乱,让
ExclusiveStartKey的SK不符合范围条件。
- 避免大小写差异(比如
4. 验证查询参数的一致性
- 除了
ExclusiveStartKey,第二次查询的其他核心参数必须和第一次完全相同:- 必须指定正确的
IndexName(即你的GSI名称),不能遗漏或写错; - 确保
ScanIndexForward(排序方向)和第一次一致,如果第一次是升序,第二次改成降序,也会导致键不匹配。
- 必须指定正确的
5. 简化场景测试
- 先去掉SK的范围条件,只按GSI的PK查询(
KeyConditionExpression: PK = :pk),测试分页是否正常。如果正常,再逐步加上SK的范围条件,定位问题出在哪个环节。
内容的提问来源于stack exchange,提问作者Akinn
相关产品推荐
相关产品推荐

