Java如何基于Hash和Range Key查询DynamoDB(含GSI索引场景)
DynamoDB GSI 同时按分区键和排序键查询修改方案
你当前使用的bookAndUserIndex全局二级索引的分区键(HK)是Book,排序键(RK)是User,DynamoDB查询索引时,分区键必须使用等值匹配,排序键可以在键条件表达式中直接加匹配规则,无需使用过滤表达式,修改步骤如下:
- 向属性值映射中新增
user参数对应的占位符 - 修改键条件表达式,同时加上排序键的等值匹配规则,为避免
user是DynamoDB保留字,建议加上表达式属性名称映射,避免语法报错
修改后的完整代码如下:
public Loan getByBookAndUser(String book, String user) { Loan loan = null; HashMap<String, AttributeValue> av = new HashMap<>(); av.put(":v1", new AttributeValue().withS(book)); av.put(":v2", new AttributeValue().withS(user)); // 规避user为保留字的冲突问题 HashMap<String, String> nameMap = new HashMap<>(); nameMap.put("#user", "User"); DynamoDBQueryExpression<Loan> queryExp = new DynamoDBQueryExpression<Loan>() .withIndexName("bookAndUserIndex") .withKeyConditionExpression("Book = :v1 AND #user = :v2") .withExpressionAttributeNames(nameMap) .withExpressionAttributeValues(av) .withConsistentRead(false); PaginatedQueryList<Loan> result = this.mapper.query(Loan.class, queryExp); if (result.size() > 0) { loan = result.get(0); } return loan; }
补充说明:
不要将
user的筛选条件放在FilterExpression中,该方式会先扫描所有分区键等于book的记录再过滤,会额外消耗读吞吐量,性能也更低。直接放在KeyConditionExpression中可以直接定位到符合两个键条件的记录,效率最高。
内容的提问来源于stack exchange,提问作者wild_tola
相关产品推荐
相关产品推荐

