Как сделать запрос AWS DynamoDB, используя несколько индексов? - PullRequest
1 голос
/ 09 мая 2019

У меня есть таблица корзины AWS DynamoDb со следующей структурой элементов -

{
  "cart_id": "5e4d0f9f-f08c-45ae-986a-f1b5ac7b7c13",
  "user_id": 1234,
  "type": "OTHER",
  "currency": "INR",
  "created_date": 132432423,
  "expiry": 132432425,
  "total_amount": 90000,
  "total_quantity": 2,  
  "items": [
    {
      "amount": 90000,
      "category": "Laptops",
      "name": "Apple MacBook Pro",
      "quantity": 1
    }
  ]
}

-

{
  "cart_id": "12340f9f-f08c-45ae-986a-f1b5ac7b1234",
  "user_id": 1234,
  "type": "SPECIAL",
  "currency": "INR",
  "created_date": 132432423,
  "expiry": 132432425,
  "total_amount": 1000,
  "total_quantity": 2,  
  "items": [
    {
      "amount": 1000,
      "category": "Special",
      "name": "Special Item",
      "quantity": 1
    }
  ]
}

Таблица будет иметь cart_id как первичный ключ,
user_id как индекс или GSI,
type как индекс или GSI.

Я хочу иметь возможность запросить таблицу корзины,
чтобы найти элементы, которые имеют user_id = 1234 AND type != "SPECIAL".
Я не знаю, означает ли это для запроса -

--key-condition-expression "user_id = 1234 AND type != 'SPECIAL'" 

Я понимаючто таблицу AWS DynamoDb нельзя запросить с использованием нескольких индексов одновременно ,
Я сталкивался со следующим вопросом, у него аналогичный вариант использования, и в ответе рекомендуется создать составной ключ,
Запросы с использованием нескольких локальных вторичных индексов Dynamodb

Означает ли это, что при добавлении нового элемента в таблицу,
мне потребуется сохранить другой столбец, такой как user_id_type,
со значением 1234SPECIAL и созданием индекса / GSI для user_id_type?

Пример структуры изделия -

{
  "cart_id": "5e4d0f9f-f08c-45ae-986a-f1b5ac7b7c13",
  "user_id": 1234,
  "type": "OTHER",
  "user_id_type" : "1234OTHER",
  "currency": "INR",
  "created_date": 132432423,
  "expiry": 132432425,
  "total_amount": 90000,
  "total_quantity": 2,  
  "items": [
    {
      "amount": 90000,
      "category": "Laptops",
      "name": "Apple MacBook Pro",
      "quantity": 1
    }
  ]
}

Ссылки -
1. Запросы с несколькими локальными вторичными индексами Dynamodb
2. Есть ли способ запроса нескольких хэшейключи в DynamoDB?

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Ваше предположение верно.Возможно, вы можете добавить в него разделитель field1_field2 или хэшировать его, если любой из них слишком большой по размеру hashOfField1_hashOfField2

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

Составной ключ в DynamoDB с более чем 2 столбцами?

Dynamodb: запрос с использованием более двух атрибутов

Дополнительная информация о вашем случае использования

KeyConditionExpression разрешено только для хеш-ключа.Вы можете поместить его в FilterExpression

Почему нет ** не равно ** сравнения в запросах DynamoDB?

0 голосов
/ 16 мая 2019

"Означает ли это, что при помещении нового элемента в таблицу мне нужно будет поддерживать другой столбец, например user_id_type, со значением 1234SPECIAL и создавать Index / GSI для user_id_type?"

Ответ зависит от сколько столбцов (динамодаб - схема меньше, по столбцу я имею в виду поле данных) вам нужно и вы довольны 2 поездки в оба конца в дБ.

ваш запрос: user_id = 1234 AND type! = "SPECIAL"

1- если вам нужна вся информация в корзине, но вас устраивают две поездки в оба конца:

  • Решение: Создайте GSI с user_id (HASH) и введите(RANGE), затем добавьте cart_id (хэш-ключ базовой таблицы) в качестве проекции.
  • Объяснение: Итак, вам нужен один запрос к индексной таблице, чтобы получить идентификатор_карты, заданный user_id, и выражение типа -key-условие "user_id = 1234 AND type! = 'SPECIAL'"затем вам нужно использовать cart_id (s) из результата и сделать другой запрос к базовой таблице

2- , если вам не нужна вся информация о корзине .

  • Решение: вам нужно создать GSI и сделать user_id HASH и набрать как RANGE и добавить больше столбцов (нужных вам столбцов) в проекции.
  • Объяснение: Проекция - это дополнительные столбцы, которые вы хотите иметь в своей индексной таблице.Таким образом, добавьте несколько дополнительных столбцов, которые, скорее всего, будут использоваться в результате запроса, чтобы избежать повторного обращения к базовой таблице
  • Примечание: добавление слишком большого количества дополнительных столбцов может удвоитьстоит, так как любое обновление базовой таблицы приводит к обновлениям в полях проекции таблиц GSI)

3- , если вы хотите всего одну поездку в оба конца и вам нужны все данные

  • тогда вам нужно управлять им самостоятельно, и ваше предложение может быть применено
...