Как создать элемент базы данных динамо без указания ключа gsi

Я работаю с таблицей db Dynamo, которая использует gsi, поэтому я могу запрашивать через дополнительный атрибут, если он присутствует. Этот атрибут будет обновляться в процессе, поэтому все элементы не имеют этого атрибута в начале процесса. Этот атрибут устанавливается как первичный ключ gsi при добавлении к элементу.

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

Любая помощь приветствуется, и мне также придется придерживаться динамо-базы данных, поэтому каждая подсказка, включая эту базу данных, очень помогает!

РЕДАКТИРОВАТЬ: Для пояснения - это мои атрибуты:

  • id (первичный ключ: обязательно)
  • имя (Атрибут)
  • год (атрибут)
  • gsi_id (первичный ключ GSI: необязательно)

Я хочу добавить элемент с полями:

  • id (первичный ключ: обязательно)
  • имя (Атрибут)
  • год (атрибут)

а затем добавьте поле gsi_id.


person Eve Edomenko    schedule 13.08.2020    source источник
comment
Dynamodb определенно позволит вам вставить элемент без указания ключей GSI. Описываемый вами шаблон известен как разреженный индекс, в котором только элементы с ключами GSI проецируются в индекс. Вы получаете какую-то ошибку?   -  person Seth Geoghegan    schedule 13.08.2020


Ответы (1)


Предпосылка вашего вопроса заключается в том, что

Я не могу вставить новый элемент, не указав также первичный ключ GSI.

Однако я считаю, что это предположение неверно. Согласно моему опыту и документации, вам очень разрешено вставлять элемент без ключевого атрибута GSI в базовую таблицу, и этот элемент будет добавлен в базовую таблицу, но отсутствовать в index - именно то, что вы хотите.

Вот, например, фрагмент из документации:

Глобальный вторичный индекс отслеживает только те элементы данных, где действительно существуют его ключевые атрибуты. Например, предположим, что вы добавили еще один новый элемент в таблицу GameScores, но предоставили только необходимые атрибуты первичного ключа. ... Поскольку вы не указали атрибут TopScore, DynamoDB не будет распространять этот элемент на GameTitleIndex.

Обратите внимание, что это верно только для отсутствующего атрибута. На самом деле вам не разрешено устанавливать значение с неправильным типом в атрибуте ключа GSI. Например, если атрибут ключа GSI определен как имеющий числовой тип, вы не можете установить строку в этом атрибуте - вы получите ошибку ValidationException при операции обновления. Но полное отсутствие атрибута - это нормально.

person Nadav Har'El    schedule 13.08.2020
comment
Спасибо за ваш ответ! Я только что проверил это с помощью python sdk и boto3. Работает нормально. Однако проблема остается, когда я использую консоль aws в веб-интерфейсе. - person Eve Edomenko; 13.08.2020