使用 AWS DynamoDB SDK 扫描 table Java 2.x
Scan a table with AWS DynamoDB SDK for Java 2.x
我在 Amazon DynamoDB 中有一个 table (users
),其中包含如下项目:
{
id: "ef1e44bc-03ad-11e9-8eb2-f2801f1b9fd1", // UUID, HASH key
version: "3.1", // Version string, conforming to semver standards
emailsEnabled: true, // Boolean flag
capabilities: { // Big nested object, not important for the question
…
}
}
我想 运行 进行临时扫描以了解有多少 3.1 版用户启用了电子邮件。我这里没有这个 table 的任何索引,但可以扫描一下。
如何使用 AWS SDK for Java 2.x 做到这一点?
您必须使用 Filter Expressions 来限制您的应用处理的数据量。
您还可以使用 ProjectionExpressions.
删除扫描结果中额外的、不重要的属性
代码如下:
DynamoDbClient client = DynamoDbClient.builder().build();
ScanRequest request =
ScanRequest
.builder()
.tableName("users")
.filterExpression("version = :version")
.expressionAttributeValues(
Map.of(":version", AttributeValue.builder().s("3.1").build()) // Using Java 9+ Map.of
)
.projectionExpression("id, version, emailsEnabled")
.build();
ScanIterable response = client.scanPaginator(request);
for (ScanResponse page : response) {
for (Map<String, AttributeValue> item : page.items()) {
// Consume the item
System.out.println(item);
if (item.get("emailsEnabled").bool()) {
// Update counters
}
}
}
请注意,过滤表达式是在扫描完成后但在返回结果之前应用的。因此,无论是否存在过滤器表达式,扫描都会消耗相同数量的读取容量。
我在 Amazon DynamoDB 中有一个 table (users
),其中包含如下项目:
{
id: "ef1e44bc-03ad-11e9-8eb2-f2801f1b9fd1", // UUID, HASH key
version: "3.1", // Version string, conforming to semver standards
emailsEnabled: true, // Boolean flag
capabilities: { // Big nested object, not important for the question
…
}
}
我想 运行 进行临时扫描以了解有多少 3.1 版用户启用了电子邮件。我这里没有这个 table 的任何索引,但可以扫描一下。
如何使用 AWS SDK for Java 2.x 做到这一点?
您必须使用 Filter Expressions 来限制您的应用处理的数据量。
您还可以使用 ProjectionExpressions.
删除扫描结果中额外的、不重要的属性代码如下:
DynamoDbClient client = DynamoDbClient.builder().build();
ScanRequest request =
ScanRequest
.builder()
.tableName("users")
.filterExpression("version = :version")
.expressionAttributeValues(
Map.of(":version", AttributeValue.builder().s("3.1").build()) // Using Java 9+ Map.of
)
.projectionExpression("id, version, emailsEnabled")
.build();
ScanIterable response = client.scanPaginator(request);
for (ScanResponse page : response) {
for (Map<String, AttributeValue> item : page.items()) {
// Consume the item
System.out.println(item);
if (item.get("emailsEnabled").bool()) {
// Update counters
}
}
}
请注意,过滤表达式是在扫描完成后但在返回结果之前应用的。因此,无论是否存在过滤器表达式,扫描都会消耗相同数量的读取容量。