DynamoDB表分区键与排序键1:1时如何仅用分区键查询
错误原因
你遇到的Invalid KeyConditionExpression: An expression attribute value used in expression is not defined报错,核心原因是KeyConditionExpression的写法不符合DynamoDB语法规则:
- 表达式中以
:开头的内容是值占位符,不是直接拼接实际参数值的位置 - 你写的
:1234567890被DynamoDB识别为一个未绑定实际值的占位符,由于你没有通过ExpressionAttributeValues参数给这个占位符传入对应的实际取值,因此直接抛出参数未定义的错误。
即使你的表分区键和排序键是1:1映射、指定分区键只会返回单条数据,只要表定义了排序键,Query操作本身不需要强制传入排序键条件,正确绑定分区键参数值即可完成查询。
正确实现代码
你可以按照如下方式修改代码,额外添加Limit(1)参数可以避免不必要的数据读取,进一步优化查询性能:
import com.amazonaws.services.dynamodbv2.model.AttributeValue; import java.util.HashMap; import java.util.Map; // 1. 构建表达式占位符和实际值的绑定映射 Map<String, AttributeValue> expValues = new HashMap<>(); // 给占位符 :partitionKeyVal 绑定字符串类型的分区键实际值 expValues.put(":partitionKeyVal", new AttributeValue().withS("1234567890")); // 2. 构建查询请求 QueryRequest query = new QueryRequest() .withTableName(TABLE_NAME) .withKeyConditionExpression("testId = :partitionKeyVal") .withLimit(1) // 已知仅返回1条数据,加该参数减少冗余扫描 .withExpressionAttributeValues(expValues); // 3. 执行查询 QueryResult result = client.query(query); // 从result.getItems()中取第一条数据即可,正常场景下该列表仅包含1条元素
补充说明
如果你后续可以拿到对应记录的排序键取值,更推荐使用
GetItemAPI,传入完整的分区键+排序键组合做单行精确读取,查询延迟和读取容量单位(CU)消耗会比Query更低。
内容的提问来源于stack exchange,提问作者faders
相关产品推荐
相关产品推荐

