I have a dynamodb table that has a Global secondary Index with a range key (email, hashedPassword ).
i want to save an item if the email is not duplicated,
i used attribute_not_exists
but it doesn't work, i also used :
ConditionExpression: "#email <> :email",
ExpressionAttributeNames: {"#email": "email"},
ExpressionAttributeValues: {":email": userInfo.email}
without success.
Can anyone help me please,
Thank you.
I have a dynamodb table that has a Global secondary Index with a range key (email, hashedPassword ).
i want to save an item if the email is not duplicated,
i used attribute_not_exists
but it doesn't work, i also used :
ConditionExpression: "#email <> :email",
ExpressionAttributeNames: {"#email": "email"},
ExpressionAttributeValues: {":email": userInfo.email}
without success.
Can anyone help me please,
Thank you.
Share asked Dec 11, 2017 at 20:30 SmartoopSmartoop 7257 silver badges13 bronze badges 2- What is your primary key (hash key and sort key if you have one)? – F_SO_K Commented Dec 12, 2017 at 8:44
- @Stu hashKey is "Id" – Smartoop Commented Dec 12, 2017 at 17:26
2 Answers
Reset to default 6The condition expression for DynamoDB only works on the item it is working with, and not across items.
In other words, condition expression does not get evaluated against other items.
For example, if you are creating a new item, you can only enforce the email constraint if you use the Primary Key (Partition + Sort Key if you have one) as the unique constraint.
Some options you have:
- Perform a read before the insert. This is not going to guarantee uniqueness of the email, but should catch a lot of duplicates.
- Use Email as the Primary Key.
- Perform a consistent read after the insert, which rolls back the creation
HTH
In case someone has the same problem, here is my approach:
- Perform a read on
gsi
before the insert - Perform TransactWriteItems with ClientRequestToken (using the data of
gsi
) to prevent multiple requests in a short time
See this Reference.