java - 如何在 java 中通过哈希和范围键查询 DynamoDB?
问题描述
我是相当新的DynamoDB
sdk。我真的不知道如何使用 hashKey 和 rangeKey 在 DynamoDB 中的表中进行查询。
表架构:
1. Id (HK)
2. Book (GSI HK)
3. User (GSI RK)
我正在使用全局二级索引GSI: bookAndUserIndex
。代码片段:
public Loan getByBookAndUser(String book, String user) {
Loan loan = null;
HashMap<String, AttributeValue> av = new HashMap<>();
av.put(":v1", new AttributeValue().withS(book));
DynamoDBQueryExpression<Loan> queryExp = new DynamoDBQueryExpression<Loan>()
.withIndexName("bookAndUserIndex")
.withKeyConditionExpression("book = :v1")
.withExpressionAttributeValues(av)
.withConsistentRead(false);
PaginatedQueryList<Loan> result = this.mapper.query(Loan.class, queryExp);
if (result.size() > 0) {
loan = result.get(0);
}
return loan;
}
如何编辑此代码以过滤/获取user
?
解决方案
您只需将范围(排序)键添加到表达式中:
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(":user", new AttributeValue().withS(user));
DynamoDBQueryExpression<Loan> queryExp = new DynamoDBQueryExpression<Loan>()
.withIndexName("bookAndUserIndex")
.addExpressionAttributeNamesEntry("#user", "user")
.withKeyConditionExpression("book = :v1 AND #user = :user")
.withExpressionAttributeValues(av)
.withConsistentRead(false);
PaginatedQueryList<Loan> result = this.mapper.query(Loan.class, queryExp);
if (result.size() > 0) {
loan = result.get(0);
}
return loan;
}
这在AWS SDK for Java 文档中有详细记录。
推荐阅读
- flask - 如何从烧瓶缓存中检索所有密钥?
- postgresql - 如何将数据从 PostgreSQL 导入 Salesforce?
- php - PDO 语句 select where date less than error
- arduino - 如何在 ESP8266 的 loop() 中连接 AP
- php - htaccess 正则表达式返回内部服务器错误
- python - 如何直接从 url 逐字逐句读取?
- c# - cefsharp 更改音频源名称
- android - Mockito - 为所有模拟方法设置默认返回字符串值
- python-3.x - LinAlgError:使用 p 值构建逻辑回归模型时出现奇异矩阵误差
- r - 在 R 中:根据时间段条件连接两个数据帧