DynamoDB全局二级索引查询报Query Key Condition not supported如何解决
问题原因
你遇到的报错是因为违反了DynamoDB的查询规则,核心问题出在你创建的全局二级索引的键结构上:
你的sortKeyIndex的KeySchema配置如下:
"KeySchema": [ { "AttributeName": "sortKey", "KeyType": "HASH" } ]
这里的sortKey在这个二级索引里是HASH类型(分区键),DynamoDB对Query操作的键条件有强制约束:
- 分区键(HASH)的查询条件只能使用等值运算符
=,不支持任何范围比较 - 只有排序键(RANGE)才支持
>、<、BEGINS_WITH、BETWEEN这类范围运算符
你之前查阅文档看到的范围运算符支持场景,都是针对排序键的,不适用于分区键。
解决方案
方案1:调整二级索引结构(推荐)
如果你的高频查询就是按sortKey做范围过滤,建议重建sortKeyIndex,调整键结构:
- 新增一个所有数据都共有的固定值字段作为索引的HASH键(比如所有项都有
dataType = "biz_record"这类属性) - 将
sortKey设置为该索引的RANGE键
调整后你就可以用符合规则的键条件查询:
QuerySpec querySpec = new QuerySpec(); // 先匹配HASH键的固定值,再对RANGE键做范围查询 querySpec.withKeyConditionExpression("dataType = :dt AND sortKey > :end_date") .withValueMap(new ValueMap() .withString(":dt", "biz_record") .withString(":end_date","2021-06-30T07:49:22.000Z")); items2 = index.query(querySpec);
方案2:使用Scan操作(仅小数据量场景可用)
如果无法调整索引结构,只能用Scan操作加过滤条件实现需求,注意该操作会扫描全表,数据量大时会消耗大量吞吐量、性能极低:
ScanSpec scanSpec = new ScanSpec() .withFilterExpression("sortKey > :end_date") .withValueMap(new ValueMap().withString(":end_date","2021-06-30T07:49:22.000Z")); ItemCollection<ScanOutcome> items = table.scan(scanSpec);
内容的提问来源于stack exchange,提问作者realslimjp
相关产品推荐
相关产品推荐

