使用JavaSDK2查询100多个与分区键匹配的DynamoDB项?
如何使用aws java sdk 2查询dynamodb表中与特定分区键匹配的100多个项? 如果需要使用与哈希键匹配的行数。此方法接受需要的 当我用一个哈希键(而不是排序键)构造一个KeysandAttribute时,我得到以下异常 DynamodBeException:提供的键元素与架构不匹配 但是,如果我在KeysandAttribute中提供了排序键,那么batchGetItemPaginator方法就可以正常工作 那么,BatchGetItemRequest如何仅使用主键(无排序键)构建呢 注意:我的问题不是重复的。如果行数超过100,则另一个问题不涉及所需的分页使用JavaSDK2查询100多个与分区键匹配的DynamoDB项?,java,amazon-web-services,aws-java-sdk-2.x,aws-java-sdk-dynamodb,Java,Amazon Web Services,Aws Java Sdk 2.x,Aws Java Sdk Dynamodb,如何使用aws java sdk 2查询dynamodb表中与特定分区键匹配的100多个项? 如果需要使用与哈希键匹配的行数。此方法接受需要的 当我用一个哈希键(而不是排序键)构造一个KeysandAttribute时,我得到以下异常 DynamodBeException:提供的键元素与架构不匹配 但是,如果我在KeysandAttribute中提供了排序键,那么batchGetItemPaginator方法就可以正常工作 那么,BatchGetItemRequest如何仅使用主键(无排序键)构
提前感谢您的考虑和回复。主键>>分区+哈希键 用于通过主键获取一项 用于使用多个主键从多个表中获取多个项。所以,我们需要传递分区列表和HashKey 我们永远不能使用部分键(即分区键)执行getItem或batchGetItem 要仅通过分区键获取项,我们必须使用api,它最多返回1MB的数据。要获取具有特定分区键的所有记录,我们可以使用exclusiveStartKey多次调用查询api进行分页
.exclusiveStartKey(exclusiveStartKey)
帮助我们在特定记录之后开始
.limit(10)
通常设置为一个合理的数字,其总大小不超过1MB。如果不考虑任何项目,我们可以将其排除在外
response.lastEvaluatedKey()
从要用于下一次查询的响应中捕获此项
public static Map<String, AttributeValue> queryTable(DynamoDbClient ddb, String tableName, String partitionKeyName,
String partitionKeyVal, Map<String, AttributeValue> exclusiveStartKey) {
Map<String, AttributeValue> lastEvaluatedKey = null;
HashMap<String, AttributeValue> attrValues = new HashMap<String, AttributeValue>();
attrValues.put(":" + partitionKeyName, AttributeValue.builder().s(partitionKeyVal).build());
QueryRequest queryReq = QueryRequest.builder().tableName(tableName).exclusiveStartKey(exclusiveStartKey)
.keyConditionExpression(partitionKeyName + " = :" + partitionKeyName)
.expressionAttributeValues(attrValues).limit(10).build();
try {
QueryResponse response = ddb.query(queryReq);
lastEvaluatedKey = response.lastEvaluatedKey();
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
System.exit(1);
}
return lastEvaluatedKey;
}
谢谢你的回复!
query
和BatchGetItem
之间的澄清非常有用。但是,查询文档声明响应最多为1MB。您能将示例更新为包含分页吗?@RamónJRomeroyVigil用分页查询示例更新了答案
public static void main(String[] args) {
Region region = Region.US_EAST_1;
DynamoDbClient ddb = DynamoDbClient.builder().region(region).build();
Map<String, AttributeValue> lastEvaluatedKey = null;
// Loop until we don't get lastEvaluatedKey
do {
System.out.println("---------DynamoDb Query with Exclusive Start Key------------" + lastEvaluatedKey);
lastEvaluatedKey = queryTable(ddb, "test", "pk", "1", lastEvaluatedKey);
} while (lastEvaluatedKey != null && !lastEvaluatedKey.isEmpty());
ddb.close();
}