Это скорее прояснение концепции. Я могу найти фактические значения с помощью Boto3 через повторные запросы с использованием LastEvaluatedKey предыдущего ответа.
Я хочу подсчитать элементы, соответствующие определенным условиям в DynamoDb. Я использую "select = count", который в соответствии с документами [1] должен просто возвращать количество совпадающих элементов, и мое предположение , что ответ не будет разбит на страницы.
COUNT - возвращает количество подходящих элементов, а не сами соответствующие элементы.
Когда я пробую это с помощью aws -cli, мои предположения кажутся правильными (как и остальные примеры API в do c [1])
aws dynamodb query \
--table-name 'my-table' \
--index-name 'classification-date-index' \
--key-condition-expression 'classification = :col AND #dt BETWEEN :start AND :end' \
--expression-attribute-values '{":col" : {"S":"INTERNAL"}, ":start" : {"S": "2020-04-10"}, ":end" : {"S": "2020-04-25"}}' \
--expression-attribute-names '{"#dt" : "date"}' \
--select 'COUNT'
{
"Count": 18817,
"ScannedCount": 18817,
"ConsumedCapacity": null
}
Но когда я пытаюсь использовать Python3 и Boto3, ответ разбивается на страницы, и мне приходится повторять запрос, пока LastEvaluatedKey не станет пустым.
In [22]: table.query(IndexName='classification-date-index', Select='COUNT', KeyConditionExpression= Key('classification').eq('INTERNAL') & Key('date').between('2020-04-10', '2020-04-25'))
Out[22]:
{'Count': 5667,
'ScannedCount': 5667,
'LastEvaluatedKey': {'classification': 'INTERNAL',
'date': '2020-04-14',
's3Path': '<redacted>'},
'ResponseMetadata': {'RequestId': 'TH3ILO0P47QB7GAU9M3M98BKJVVV4KQNSO5AEMVJF66Q9ASUAAJG',
'HTTPStatusCode': 200,
'HTTPHeaders': {'server': 'Server',
'date': 'Sat, 25 Apr 2020 13:32:36 GMT',
'content-type': 'application/x-amz-json-1.0',
'content-length': '230',
'connection': 'keep-alive',
'x-amzn-requestid': 'TH3ILO0P47QB7GAU9M3M98BKJVVV4KQNSO5AEMVJF66Q9ASUAAJG',
'x-amz-crc32': '133035383'},
'RetryAttempts': 0}}
Я ожидал такого же поведения от SDK Boto3, как aws cli, так как ответ кажется меньше, чем 1mb. Документы немного противоречат друг другу ...
На странице «Страница страниц с результатами запросов» [2] говорится:
DynamoDB разбивает на страницы результаты операций запросов. С разбивкой по страницам результаты запроса делятся на «страницы» данных размером 1 МБ (или меньше). Приложение может обработать первую страницу результатов, затем вторую страницу и так далее. Один запрос возвращает только набор результатов, который вписывается в ограничение размера 1 МБ.
В то время как на странице «Запрос» [1] говорится:
Одна операция запроса будет считывать до максимального количества установленных элементов (если используется параметр Limit) или до 1 МБ данных, а затем применяет любую фильтрацию к результатам, используя FilterExpression.
[1] https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html
[2] https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.Pagination.html