web-dev-qa-db-fra.com

Comment empêcher la création d'un nouvel élément dans UpdateItem si l'élément n'existe pas

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',
};
31
Stanley

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"
};
25
notionquest

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.

réf: https://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html

18
Gabriel Bleu