node.js AWS dynamodb updateItem
This is exactly what AWS.DynamoDB.DocumentClient's update
method does.
There is already a sample code on how to use the update
method here for AWS SDK for JavaScript in Node.js.
For example:
'use strict';const aws = require('aws-sdk');// It is recommended that we instantiate AWS clients outside the scope of the handler // to take advantage of connection re-use.const docClient = new aws.DynamoDB.DocumentClient();exports.handler = (event, context, callback) => { const params = { TableName: "MYTABLE", Key: { "id": "1" }, UpdateExpression: "set variable1 = :x, #MyVariable = :y", ExpressionAttributeNames: { "#MyVariable": "variable23" }, ExpressionAttributeValues: { ":x": "hello2", ":y": "dog" } }; docClient.update(params, function(err, data) { if (err) console.log(err); else console.log(data); });};
You can update attributes dynamically. see below code.
export const update = (item) => { console.log(item) const Item = { note: "dynamic", totalChild: "totalChild", totalGuests: "totalGuests" }; let updateExpression='set'; let ExpressionAttributeNames={}; let ExpressionAttributeValues = {}; for (const property in Item) { updateExpression += ` #${property} = :${property} ,`; ExpressionAttributeNames['#'+property] = property ; ExpressionAttributeValues[':'+property]=Item[property]; } console.log(ExpressionAttributeNames); updateExpression= updateExpression.slice(0, -1); const params = { TableName: TABLE_NAME, Key: { booking_attempt_id: item.booking_attempt_id, }, UpdateExpression: updateExpression, ExpressionAttributeNames: ExpressionAttributeNames, ExpressionAttributeValues: ExpressionAttributeValues }; return dynamo.update(params).promise().then(result => { return result; }) }
Here is a utility method to do that:
update: async (tableName, item, idAttributeName) => { var params = { TableName: tableName, Key: {}, ExpressionAttributeValues: {}, ExpressionAttributeNames: {}, UpdateExpression: "", ReturnValues: "UPDATED_NEW" }; params["Key"][idAttributeName] = item[idAttributeName]; let prefix = "set "; let attributes = Object.keys(item); for (let i=0; i<attributes.length; i++) { let attribute = attributes[i]; if (attribute != idAttributeName) { params["UpdateExpression"] += prefix + "#" + attribute + " = :" + attribute; params["ExpressionAttributeValues"][":" + attribute] = item[attribute]; params["ExpressionAttributeNames"]["#" + attribute] = attribute; prefix = ", "; } } return await documentClient.update(params).promise();}