0

users在 Amazon DynamoDB 中有一个表 ( ),其中包含以下项目:

{
   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 版用户启用了电子邮件。我这里没有此表的任何索引,但可以进行扫描。

如何使用AWS SDK for Java 2.x做到这一点?

4

1 回答 1

2

您必须使用过滤器表达式来限制您的应用程序处理的数据量。

您还可以使用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
        }
    }
}

请注意,在扫描完成之后,但在返回结果之前应用过滤器表达式。因此,无论是否存在过滤器表达式,一次扫描都会消耗相同数量的读取容量。

于 2018-12-19T17:30:25.357 回答