Estoy intentando actualizar un elemento en Amazon DynamoDB. Quiero ejecutar una operación que consta de una suma y una resta, pero no puedo lograr mi objetivo.
Aquí está la función, ddb es una instancia de la clase AWS.DynamoDB.DocumentClient :
function updateLecture(event){ const params = { TableName: 'lecture', Key: { 'lecture_id': Number.parseInt(event.lecture_id) }, UpdateExpression: 'SET #free = :total - (#total + #free)', ExpressionAttributeValues: { ':total': event.total }, ExpressionAttributeNames: { "#total" : "total", "#free" : "free" }, ReturnValues : 'UPDATED_NEW' } return ddb.update(params).promise(); }Cuando intento ejecutar la función, aparece el siguiente error:
"errorType": "ValidationException", "errorMessage": "Invalid UpdateExpression: Syntax error; token: \"+\", near: \"#total + #free\""He intentado trabajar con paréntesis, pero siempre recibo el mismo error.
Me temo que no puedo usar más de una operación, pero no pude encontrar ningún rastro de eso en los documentos . De todos modos, ¿hay alguna manera de usar múltiples operaciones?
Acabo de probar la siguiente declaración de PartiQL en la consola de DynamoDB y funcionó bien:
// Works just fine UPDATE "ddb-playground" SET myNumA = 10 - (myNumB + myNumA) WHERE PK = 'foo' AND SK = 'bar'Funciona bien, así que al menos no hay una limitación fundamental aquí.
Sin embargo, al igual que usted, no puedo hacer que JS SDK haga esto con UpdateExpression, obtengo un error de sintaxis sin importar lo que intente. Entonces parece que el JS SDK está limitado a una sola expresión aritmética en valores numéricos.
// Fails with: // // ValidationException: Invalid UpdateExpression: Syntax error; token: "+", near: "myNumB + myNumA" import AWS from "aws-sdk" const ddb = new AWS.DynamoDB() await ddb.putItem({ TableName: "ddb-playground", Item: { PK: {S: "foo"}, SK: {S: "bar"}, myNumA: {N: "10"}, myNumB: {N: "20"} } }).promise() await ddb.updateItem({ TableName: "ddb-playground", Key: { PK: {S: "foo"}, SK: {S: "bar"} }, UpdateExpression: "SET myNumA = :newVal - (myNumB + myNumA)", ExpressionAttributeValues: { ":newVal": {N: "30"} } }).promise()Entonces, ¿tal vez su única opción aquí es usar PariQL para este?
await ddb.executeStatement({ Statement: 'UPDATE "ddb-playground" SET myNumA = ? - (myNumB + myNumA) WHERE PK = ? AND SK = ?', Parameters: [{N: "30"}, {S: "foo"}, {S: "bar"}] }).promise()