Сканирование таблицы с помощью AWS DynamoDB SDK для Java 2.x

У меня есть стол (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 для Java 2.x?

1 ответ

Решение

Вы должны будете использовать выражения фильтра, чтобы ограничить объем данных, обрабатываемых вашим приложением.

Вы также можете избавиться от дополнительных, неважных атрибутов в результатах сканирования, используя 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
        }
    }
}

Обратите внимание, что выражение фильтра применяется после завершения сканирования, но до возвращения результатов. Таким образом, сканирование будет потреблять одинаковую емкость чтения независимо от того, присутствует выражение фильтра или нет.

Другие вопросы по тегам