2017-12-11 5 views
1

Ich habe eine Dynamob Tabelle, die einen globalen sekundären Index mit einem Bereichsschlüssel (E-Mail, hashedPassword) hat. Ich möchte ein Element speichern, wenn die E-Mail nicht dupliziert, i attribute_not_exists verwendet, aber es funktioniert nicht, habe ich auch:Wie Artikel in Dynamodb mit GSI-Bedingung speichern?

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

ohne Erfolg.

Kann mir bitte helfen,

Vielen Dank.

+0

Was ist Ihr Primärschlüssel ist ein Rollback (Raute-Taste und Sortierschlüssel, wenn Sie eine haben)? – Stu

+0

@Stu HashKey ist "Id" – Smartoop

Antwort

1

Der Bedingungsausdruck für DynamoDB funktioniert nur mit dem Element, mit dem er arbeitet, und nicht mit Elementen.

Mit anderen Worten, Bedingung Ausdruck wird nicht gegen andere Elemente ausgewertet.

Wenn Sie beispielsweise ein neues Element erstellen, können Sie die E-Mail-Einschränkung nur erzwingen, wenn Sie den Primärschlüssel (Partition + Sortierschlüssel, falls vorhanden) als eindeutige Einschränkung verwenden.

Einige Optionen haben Sie:

  • eine Lese vor dem Einsatz durchführen. Dies wird die Eindeutigkeit der E-Mail nicht garantieren, sollte aber viele Duplikate enthalten.
  • Verwenden Sie E-Mail als Primärschlüssel.
  • Führen Sie eine konsistente Lese nach dem Einsatz, die die Schaffung

HTH

+0

Ich habe die erste Option verwendet, aber ich habe nicht bekommen "Dies wird nicht garantieren, Einzigartigkeit der E-Mail, aber sollte eine Menge Duplikate zu fangen." Wie kann das möglich sein? – Smartoop

+1

Wenn zwei Einfügungen für dieselbe E-Mail-Adresse zur gleichen Zeit stattfinden, werden beide feststellen, dass keine übereinstimmenden E-Mails vorhanden sind und beide eingefügt werden. –

Verwandte Themen