amazon dynamodb - que - Cómo evitar la creación de un nuevo elemento en UpdateItem si el elemento no existe
dynamodb query (2)
Estoy ejecutando un servicio de AWS Lambda escrito en Node.js que interactúa con una base de datos DynamoDB. Uno de mis métodos realiza una actualización (AWS.DynamoDB.DocumentClient (). Update) en DynamoDB para actualizar un elemento específico. Sin embargo, mi problema es que cuando intento actualizar un elemento y ese elemento no existe, el método de actualización agrega este nuevo elemento a mi tabla. Este comportamiento es el predeterminado descrito en la documentation también.
No quiero que mi método cree un nuevo elemento si aún no existe. Quiero que esto sea una actualización solo si el registro existe. Si no existe, no debe hacer nada. ¿Cómo logro esto? Espero poder usar una expresión condicional para lograr esto, pero los intentos que hice para lograrlo no han tenido éxito.
A continuación se muestra un ejemplo de los parámetros actuales que envío a la función de actualización. En este ejemplo, quiero actualizar el usuario que tiene userId 123 y quiero configurar el campo isActive en ''false'' para este usuario (¡pero solo quiero hacer esto si el usuario 123 existe realmente!)
const params = {
TableName: ''users'',
Key: {
userId: ''123'',
},
ExpressionAttributeValues: {
'':isActive'': ''false''
},
UpdateExpression: ''SET isActive = :isActive'',
ReturnValues: ''ALL_NEW'',
};
ConditionExpression es el camino a seguir, pero también puede usar la función attribute_exists
:
ConditionExpression: ''attribute_exists(userId)''
Solo actualizará la línea con la clave correcta y lanzará una ConditionalCheckFailedException
si la clave solicitada no existe.
El objetivo es más obvio y puede omitir el enlace de ID de usuario adicional.
Puede utilizar ConditionExpression
para esto. La actualización ocurrirá si la clave (es decir, userId) está presente y el atributo de actualización (es decir, isActive) no es igual al nuevo valor que está intentando actualizar.
ConditionExpression: "userId = :userIdVal and isActive <> :isActiveVal",
ExpressionAttributeValues: {
'':isActive'' : ''false'',
'':userIdVal'' : ''123''
},
EDITAR:-
Esto debería funcionar. Debe ser ConditionExpression
(no 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"
};