J'exécute un service AWS Lambda écrit dans Node.js qui interagit avec une base de données DynamoDB. Une de mes méthodes effectue une mise à jour (AWS.DynamoDB.DocumentClient (). Update) sur DynamoDB pour mettre à jour un élément spécifique. Mon problème est, cependant, que lorsque j'essaie de mettre à jour un élément et que cet élément n'existe pas, la méthode de mise à jour ajoute ce nouvel élément à ma table. Ce comportement est également celui par défaut décrit dans documentation .
Je ne veux pas que ma méthode crée un nouvel élément s'il n'existe pas encore. Je veux que ce soit une mise à jour uniquement si l'enregistrement existe. S'il n'existe pas, il ne doit rien faire. Comment puis-je y parvenir? Je m'attends à ce que je devrais pouvoir utiliser une expression conditionnelle pour y parvenir, mais les tentatives que j'ai faites pour y parvenir n'ont pas réussi.
Un exemple des paramètres actuels que j'envoie à la fonction de mise à jour est donné ci-dessous. Dans cet exemple, je veux mettre à jour l'utilisateur qui a userId 123 et je veux définir le champ isActive sur 'false' pour cet utilisateur (mais je ne veux le faire que si l'utilisateur 123 existe réellement!)
const params = {
TableName: 'users',
Key: {
userId: '123',
},
ExpressionAttributeValues: {
':isActive': 'false'
},
UpdateExpression: 'SET isActive = :isActive',
ReturnValues: 'ALL_NEW',
};
Vous pouvez utiliser ConditionExpression
pour cela. La mise à jour se produira si la clé (c'est-à-dire userId) est présente et l'attribut de mise à jour (c'est-à-dire isActive) n'est pas égal à la nouvelle valeur que vous essayez de mettre à jour.
ConditionExpression: "userId = :userIdVal and isActive <> :isActiveVal",
ExpressionAttributeValues: {
':isActive' : 'false',
':userIdVal' : '123'
},
MODIFIER: -
Cela devrait fonctionner. Il doit être ConditionExpression
(pas ConditionalExpression).
var params = {
TableName: 'users',
Key: {
'userId': '123'
},
UpdateExpression: 'SET isActive = :isActiveVal',
ConditionExpression: 'userId = :userIdVal and isActive <> :isActiveVal',
ExpressionAttributeValues: {
':userIdVal' : '123',
':isActiveVal': 'false'
},
ReturnValues: "ALL_NEW"
};
ConditionExpression est le chemin à parcourir, mais vous pouvez également utiliser le attribute_exists
une fonction :
ConditionExpression: 'attribute_exists(userId)'
Il ne mettra à jour la ligne qu'avec la bonne clé et lancera un ConditionalCheckFailedException
si la clé demandée n'existe pas.
L'objectif est plus évident et vous pouvez ignorer la liaison supplémentaire userId.