Сканирование таблицы с помощью 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
}
}
}
Обратите внимание, что выражение фильтра применяется после завершения сканирования, но до возвращения результатов. Таким образом, сканирование будет потреблять одинаковую емкость чтения независимо от того, присутствует выражение фильтра или нет.