You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:24:03