Запросите заказы по ключам раздела и сортировки

AWSBeginner
Практиковаться сейчас

Введение

Инструмент поддержки заказов должен показывать заказы нужного клиента за выбранный месяц. Поиск только одного элемента или остановка на пустой отфильтрованной странице может пропустить подходящие записи. Вы построите таблицу с составным ключом, запросите октябрьские заказы Ada и настроите предоставленное приложение на следование ключам продолжения для представления упакованных заказов.

Сначала выполните работу «Создайте таблицу DynamoDB для заказов», включая типизированные элементы и обновления. Этот раздел начинается независимо с новым временным подключением, файлами синтетических данных и обычным приложением. Используйте /home/labex/project, официальный AWS CLI и AWS View; ресурсы прежней VM не используются.

Связь с сертификацией

Эта лабораторная работа помогает на практике изучить следующие темы экзаменов.

Постройте ключи вокруг шаблона доступа

На этом шаге вы подготовите заказы, которым нужен поиск по клиенту и дате. Составной первичный ключ имеет ключ раздела и ключ сортировки. Ключ раздела группирует заказы клиента; ключ сортировки определяет каждый заказ внутри группы и упорядочивает результаты запроса. Оба значения вместе определяют один элемент.

Даты используют строки фиксированной ширины 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; диапазон дат выбирает его октябрьские заказы.

Ключ клиента выбирает раздел 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.

Официальный пример DynamoDB Console с Query по ключу раздела.

Источник: Учебное руководство 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 пустой, но её ключ продолжения ведёт к упакованному заказу.

Первые две страницы: фильтрация оставляет страницу 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 для получения упакованного заказа через страницы, затем вы удалили только собственные ресурсы.