web-dev-qa-db-fra.com

DynamoDB: updateItem uniquement s'il existe déjà

Par défaut, DynamoDB crée une nouvelle entrée si un objet avec l'index spécifié n'existe pas. Existe-t-il un moyen d'empêcher que cela se produise? Je pourrais simplement interroger la table pour la clé avant la mise à jour, mais ce serait bien de tout faire en une seule demande.

17
Bananable

Utiliser une expression conditionnelle id = :idid est le nom de l'attribut (ou le nom de la clé primaire dans votre cas) et :id est la valeur (clé de l'élément que vous souhaitez mettre à jour).

L'expression conditionnelle est toujours évaluée avant toute écriture. Si cette expression n'est pas évaluée à true (et ce n'est pas le cas si cette clé n'existe pas ou est différente), elle ne met pas à jour ni ne place un nouvel élément.

13
Solo

Le point clé est que ConditionExpression est examiné sur différents ensembles de données en fonction de l'opération que vous effectuez PutItem ou pdateItem .

PutItem.

Lorsque vous définissez ConditionExpression DynamoDB vérifiera votre condition sur l'une des lignes de clé - de nombreuses lignes si vous utilisez l'attribut de plage sur la table ou juste 1 si vous n'utilisez qu'un hachage pour votre table -.

Rappelez-vous que l'opération DynamoDB PutItem doit vérifier si la clé que vous passez existe déjà, donc aucun frais supplémentaire pour vérifier votre condition ici.

Par exemple, si vous disposez d'une table CUSTOMER_CONTACTS avec la définition de clé customer_id/contact_email et que vous ne souhaitez pas créer de doublons, vous pouvez définir ConditionExpression = "#contact_email <> :email". Dans ce cas, l'opération PutItem échouera avec ConditionalCheckFailedException si le même e-mail (attribut de plage) est utilisé pour la valeur de hachage spécifiée.

Mais ne vous attendez pas à rechercher des attributs d'élément loin de vos lignes de hachage. Aucun sens pour DynamoDB de scanner toute la table juste pour vérifier votre état.

Mettre à jour l'élément.

Si vous essayez la même condition que pour l'exemple précédent ConditionExpression = "#contact_email <> :email" l'opération est toujours prioritaire sans déclencher d'exception. Pourquoi? Parce que UpdateItem ne regarde qu'un seul élément, celui spécifié par votre clé.

Lorsque vous utilisez UpdateItem, ConditionExpression ne regarde qu'une seule ligne, celle spécifiée par les valeurs de clé que vous devez définir. Aucun moyen de vérifier votre état sur une autre ligne du tableau.

1
Nacho Coll

Vous cherchez probablement attribute_not_exists enregistrement Condition Expressions.

Lorsque cette expression conditionnelle est utilisée avec PutItem, DynamoDB recherche d'abord un élément dont la clé primaire correspond à celle de l'élément à écrire. Ce n'est que si la recherche ne renvoie rien qu'il n'y a de clé de partition dans le résultat. Sinon, la fonction attribute_not_exists ci-dessus échoue et l'écriture sera empêchée

Plus sur http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html

0
Vor