Введение
Инструмент поддержки заказов должен показывать заказы нужного клиента за выбранный месяц. Поиск только одного элемента или остановка на пустой отфильтрованной странице может пропустить подходящие записи. Вы построите таблицу с составным ключом, запросите октябрьские заказы Ada и настроите предоставленное приложение на следование ключам продолжения для представления упакованных заказов.
Сначала выполните работу «Создайте таблицу DynamoDB для заказов», включая типизированные элементы и обновления. Этот раздел начинается независимо с новым временным подключением, файлами синтетических данных и обычным приложением. Используйте /home/labex/project, официальный AWS CLI и AWS View; ресурсы прежней VM не используются.
Связь с сертификацией
Эта лабораторная работа помогает на практике изучить следующие темы экзаменов.
- Solutions Architect – Associate (SAA-C03) · Задача 3.3: Шаблоны доступа DynamoDB, запросы по ключам и пагинация.
- Developer – Associate (DVA-C02) · Задача 1.3: Шаблоны доступа DynamoDB, запросы по ключам и пагинация.
- Data Engineer – Associate (DEA-C01) · Задача 2.1: Базовая практика: Шаблоны доступа DynamoDB, запросы по ключам и пагинация.
Постройте ключи вокруг шаблона доступа
На этом шаге вы подготовите заказы, которым нужен поиск по клиенту и дате. Составной первичный ключ имеет ключ раздела и ключ сортировки. Ключ раздела группирует заказы клиента; ключ сортировки определяет каждый заказ внутри группы и упорядочивает результаты запроса. Оба значения вместе определяют один элемент.
Даты используют строки фиксированной ширины YYYY-MM-DD, за которыми следуют # и идентификатор заказа. Строковые ключи сортировки сравнивают байты UTF-8, поэтому этот формат сохраняет хронологический порядок дат. Это небольшая модель заказов, а не универсальное проектирование одной таблицы.
cd /home/labex/project
aws sts get-caller-identity
aws dynamodb create-table --table-name labex-d02-orders --attribute-definitions AttributeName=customer_id,AttributeType=S AttributeName=order_key,AttributeType=S --key-schema AttributeName=customer_id,KeyType=HASH AttributeName=order_key,KeyType=RANGE --billing-mode PAY_PER_REQUEST
aws dynamodb wait table-exists --table-name labex-d02-orders
Подготовленный orders.json содержит пять синтетических заказов, а не учётные данные. cat выводит обычный запрос API, чтобы вы изучили каждого клиента, дату и статус перед загрузкой.
cat orders.json
aws dynamodb batch-write-item --cli-input-json file://orders.json
BatchWriteItem загружает эти разные ключи. Подтвердите, что UnprocessedItems равен {}. В AWS необработанный пакет нужно повторить; один ответ не гарантирует завершение всех записей. Пример включает сентябрьский, октябрьские и ноябрьский заказы Ada плюс октябрьский заказ Bob, позволяя проверить границы, а не только один успешный путь.
Запросите одного клиента и диапазон дат
На этом шаге вы выберете октябрьские заказы Ada условиями ключей. Query требует равенства для одного ключа раздела и может сузить ключ сортировки. Scan изучает таблицу вместо первоначального выбора раздела по ключу. Следующий шаг добавляет фильтр; сначала выберите клиента и диапазон дат ключами.

Ключ клиента выбирает раздел Ada; диапазон дат выбирает его октябрьские заказы.
Сначала изучите все пять записей, чтобы понять область сканирования.
aws dynamodb scan --table-name labex-d02-orders --consistent-read --query 'Items'
Предоставленное приложение поиска заказов читает lookup.json и вызывает API Query DynamoDB. Его исполняемый файл — order-lookup; исходный код предоставлен для изучения, и писать Python не требуется. Вы настроите обычные поля запроса Query и изучите реальные результаты приложения, а не историю команд.
BETWEEN включает обе границы. Ключ заказа содержит дату с последующими # и идентификатором. Начало 2026-10-01# находится перед идентификаторами этого дня; 2026-10-31#~ находится после них, поскольку ~ сортируется после используемых здесь букв и цифр. Эта граница специфична для данного формата ключа.
Heredoc с кавычками записывает JSON буквально в lookup.json. request содержит поля Query. paginate: false пока запрашивает одну страницу приложения; продолжение вы включите на следующем шаге.
cat > lookup.json <<'JSON'
{
"paginate": false,
"request": {
"TableName": "labex-d02-orders",
"KeyConditionExpression": "customer_id = :customer AND order_key BETWEEN :start AND :end",
"ExpressionAttributeValues": {
":customer": {
"S": "ada"
},
":start": {
"S": "2026-10-01#"
},
":end": {
"S": "2026-10-31#~"
}
},
"ConsistentRead": true
}
}
JSON
Значения Query используют типизированные строки, как в GetItem. Файл приложения также содержит собственную настройку paginate, поэтому сравните его с прямым запросом CLI для тех же ключей.
aws dynamodb query --table-name labex-d02-orders --key-condition-expression 'customer_id = :customer AND order_key BETWEEN :start AND :end' --expression-attribute-values '{":customer":{"S":"ada"},":start":{"S":"2026-10-01#"},":end":{"S":"2026-10-31#~"}}' --consistent-read
./order-lookup
Оба результата содержат только O100 и O101 Ada в возрастающем порядке ключа сортировки. O200 Bob и заказы Ada вне месяца исключены. Откройте AWS View, чтобы увидеть фактический результат Order lookup рядом с сохранёнными элементами таблицы. Эти чтения не меняют записи.
Официальный пример Console ниже показывает Query по ключу раздела. Его Artist и songTitle имеют те же роли ключей, что здесь customer_id и order_key. Используйте его для знакомства с интерфейсом; продолжайте упражнение в Terminal и AWS View.

Источник: Учебное руководство AWS DynamoDB.
Продолжайте пагинацию даже при пустой отфильтрованной странице
На этом шаге вы получите упакованные октябрьские заказы, не останавливаясь на пустой первой странице. DynamoDB применяет Limit к изучаемым элементам до фильтра. Ответы Query могут содержать LastEvaluatedKey, даже когда Items пуст. Этот ключ продолжения, а не количество элементов, сообщает приложению, нужна ли следующая страница. Фильтр не уменьшает уже выполненную работу чтения.
Подготовленный packed-page.json сохраняет те же ключи, добавляет фильтр статуса PACKED и задаёт Limit: 1. Этот малый предел делает границу страницы видимой. --no-paginate останавливает получение дополнительных страниц CLI, чтобы вы изучили один ответ сервиса.
cat packed-page.json
aws dynamodb query --cli-input-json file://packed-page.json --no-paginate
Первый изучаемый заказ имеет статус NEW, поэтому ожидайте Items: [], Count: 0, ScannedCount: 1 и LastEvaluatedKey для O100. Это не конец набора результатов.

Первые две страницы: фильтрация оставляет страницу 1 пустой, но её ключ продолжения ведёт к упакованному заказу.
Запишите конфигурацию приложения, чтобы следовать этому ключу до прекращения его возврата API. #state избегает зарезервированного слова status, а :state несёт значение фильтра.
cat > lookup.json <<'JSON'
{
"paginate": true,
"request": {
"TableName": "labex-d02-orders",
"KeyConditionExpression": "customer_id = :customer AND order_key BETWEEN :start AND :end",
"ExpressionAttributeValues": {
":customer": {
"S": "ada"
},
":start": {
"S": "2026-10-01#"
},
":end": {
"S": "2026-10-31#~"
},
":state": {
"S": "PACKED"
}
},
"ConsistentRead": true,
"ExpressionAttributeNames": {
"#state": "status"
},
"FilterExpression": "#state = :state",
"Limit": 1
}
}
JSON
./order-lookup
Приложение возвращает только O101 Ada со статусом PACKED, Count: 1 и Evaluated: 2. В этом наборе данных Pages: 3 включает последний пустой запрос, устанавливающий конец запроса. Ключ продолжения отмечает границу чтения; он не гарантирует дополнительные подходящие элементы. Приложение следует ExclusiveStartKey, пока сервис не перестанет его возвращать. В AWS View результат поиска меняется, а все сохранённые записи остаются без изменений.

Проверьте инвентаризацию и удалите собственную таблицу
На этом шаге вы выполните очистку после доказательства поведения поиска. Сначала проверьте, что целевая таблица всё ещё содержит пять исходных записей. Чтения и изменения конфигурации не должны менять данные заказов.
aws dynamodb scan --table-name labex-d02-orders --consistent-read --select COUNT
Ожидайте Count: 5. Удалите только labex-d02-orders, затем дождитесь её отсутствия. Эталонная таблица принадлежит среде и должна остаться.
aws dynamodb delete-table --table-name labex-d02-orders
aws dynamodb wait table-not-exists --table-name labex-d02-orders
aws dynamodb list-tables
aws dynamodb get-item --table-name labex-d02-reference --key '{"id":{"S":"platform"}}' --consistent-read
Инвентаризация сохраняет только labex-d02-reference, чья заметка остаётся keep unchanged. AWS View убирает собственную таблицу и результат поиска. Успешные ответы сервиса устанавливают удаление; недоступное подключение — нет. Временное подключение заканчивается с этой VM.
Резюме
Вы сгруппировали заказы по клиенту и упорядочили их ключами сортировки на основе дат. Query выбрал нужный раздел и диапазон, а Scan изучал более широкую таблицу. Вы увидели, что фильтры выполняются после изучения и пустая страница может всё ещё требовать продолжения. Предоставленное приложение использовало фактические запросы Query для получения упакованного заказа через страницы, затем вы удалили только собственные ресурсы.



