主键 >> 分区 + HashKey
GetItem用于通过主键获取一项。
BatchGetItem用于使用多个主键从多个表中获取多个项目。所以,我们需要传递 Partition 和 HashKey 的列表
我们永远不能使用部分密钥(即分区密钥)执行 getItem 或 batchGetItem。
要仅通过分区键获取项目,我们必须使用查询api,它返回最大 1 MB 的数据。要获取具有特定分区键的所有记录,我们可以通过使用 ExclusiveStartKey 多次调用查询 api 来进行分页
.exclusiveStartKey(exclusiveStartKey)
帮助我们在特定记录之后开始。
.limit(10)
通常设置为不超过总大小超过 1 MB 的合理数字。如果没有项目不是问题,我们可以排除它。
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;
}
test
表上的样本测试,pk
作为值的分区键1
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();
}