Lambda(Node.js)からDynamoDBをUPDATE レコードの更新・加減算

AWSのLambda(Node.js)からDynamoDBのレコードを更新する方法について記載します。
UPDATEによって挿入・カラムの追加・既にあるデータの加減算についてコピペできるコードです。

その他Lambda(Node.js)からDynamoDBの操作(取得・挿入・更新・上書き・削除)について以下にまとめてます。
LambdaからDynamoDBの操作

  1. レコードの挿入・カラムの追加
  2. カラム値の加減算
  3. 参考

1. レコードの挿入・カラムの追加

updateItemでレコード追加できます。
既存のレコードがある場合はカラムごとに上書き・追加されます。
これは以下でも記載。
LambdaからDynamoDBの操作

var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB();

exports.handler = async (event) => {

    let prm = {
        TableName: "tablename",
        Key: {
            pk_name:{S:"pk_prm"},
            sk_name:{S:"sk_prm"},
        },
        UpdateExpression: "set #v1=:v1,#v2=:v2",
        ExpressionAttributeNames:{
            "#v1":"datetime",//カラム名
            "#v2":"value",//カラム名
        },
        ExpressionAttributeValues: {
            ":v1": {S:"2021-03-10T10:10:10"},//カラムの値
            ":v2": {N:"2.34"},//カラムの値
        }
    };

    let res= await dynamo_update(prm);
    
    return res;
};

function dynamo_update(params){
    return new Promise((resolve, reject) => {
        dynamo.updateItem(params,function(err, data) {
            if (err) {
                reject(err, err);
            } else {
                resolve("updated");
            }
        });
    });
}

2. カラム値の加減算

updateItemは、レコードの特定カラムに既に数値が入っている場合、その値に加算したり減算したりが行えます。UpdateExpressionを以下のように指定します。

UpdateExpression: “set #v1=:v1,#v2=#v2+:v2

この場合、カラムv1は上書き、カラムv2は前回値+今回値に更新されます。

※加減算する数値が登録されていない場合、エラーになるので注意。先に登録しておく必要があります。

var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB();

exports.handler = async (event) => {

    let prm = {
        TableName: "tablename",
        Key: {
            pk_name:{S:"pk_prm"},
            sk_name:{S:"sk_prm"},
        },
        UpdateExpression: "set #v1=:v1,#v2=#v2+:v2",//v1は上書き、v2は加算
        ExpressionAttributeNames:{
            "#v1":"datetime",//カラム名
            "#v2":"value",//カラム名
        },
        ExpressionAttributeValues: {
            ":v1": {S:"2021-03-10T10:10:10"},//カラムの値
            ":v2": {N:"2.34"},//カラムの値
        }
    };

    let res= await dynamo_update(prm);
    
    return res;
};

function dynamo_update(params){
    return new Promise((resolve, reject) => {
        dynamo.updateItem(params,function(err, data) {
            if (err) {
                reject(err, err);
            } else {
                resolve("updated");
            }
        });
    });
}

参考