Как сохранить Предмет в динамоде с условием GSI?
У меня есть таблица DynamodB, которая имеет глобальный вторичный индекс с ключом диапазона (электронная почта, hashedPassword). я хочу сохранить элемент, если письмо не дублируется, я использовал attribute_not_exists
но это не работает, я также использовал:
ConditionExpression: "#email <> :email",
ExpressionAttributeNames: {"#email": "email"},
ExpressionAttributeValues: {":email": userInfo.email}
безуспешно.
Кто-нибудь может мне помочь,
Спасибо.
2 ответа
Выражение условия для DynamoDB работает только с элементом, с которым он работает, а не с элементами.
Другими словами, выражение условия не оценивается по отношению к другим элементам.
Например, если вы создаете новый элемент, вы можете применить ограничение электронной почты только в том случае, если в качестве уникального ограничения вы используете Первичный ключ (Partition + Sort Key, если он у вас есть).
Некоторые варианты у вас есть:
- Выполните чтение перед вставкой. Это не гарантирует уникальность электронного письма, но должно поймать много дубликатов.
- Используйте электронную почту в качестве первичного ключа.
- Выполните последовательное чтение после вставки, которая откатывает создание
НТН
Если у кого-то возникнет такая же проблема, вот мой подход:
- Выполните чтение перед вставкой
- Выполните TransactWriteItems с ClientRequestToken (используя данные
gsi
) для предотвращения множественных запросов за короткое время
См. эту ссылку .