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

У меня есть таблица (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 Ответ

0 голосов
/ 19 декабря 2018

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

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

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

...