Как сохранить Предмет в динамоде с условием GSI?

У меня есть таблица DynamodB, которая имеет глобальный вторичный индекс с ключом диапазона (электронная почта, hashedPassword). я хочу сохранить элемент, если письмо не дублируется, я использовал attribute_not_exists но это не работает, я также использовал:

ConditionExpression: "#email <> :email",
ExpressionAttributeNames: {"#email": "email"},
ExpressionAttributeValues: {":email": userInfo.email}

безуспешно.

Кто-нибудь может мне помочь,

Спасибо.

2 ответа

Решение

Выражение условия для DynamoDB работает только с элементом, с которым он работает, а не с элементами.

Другими словами, выражение условия не оценивается по отношению к другим элементам.

Например, если вы создаете новый элемент, вы можете применить ограничение электронной почты только в том случае, если в качестве уникального ограничения вы используете Первичный ключ (Partition + Sort Key, если он у вас есть).

Некоторые варианты у вас есть:

  • Выполните чтение перед вставкой. Это не гарантирует уникальность электронного письма, но должно поймать много дубликатов.
  • Используйте электронную почту в качестве первичного ключа.
  • Выполните последовательное чтение после вставки, которая откатывает создание

НТН

Если у кого-то возникнет такая же проблема, вот мой подход:

  1. Выполните чтение перед вставкой
  2. Выполните TransactWriteItems с ClientRequestToken (используя данныеgsi) для предотвращения множественных запросов за короткое время

См. эту ссылку .

Другие вопросы по тегам