DynamoDBのupdateItemを、AttributeUpdatesではなくUpdateExpressionで行う

2015.04.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

丹内です。

DynamoDBのAtomic CounterをインクリメントするLambda Functionを、以下のように書きました。

var aws = require('aws-sdk');
var dynamodb = new aws.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = function(event, context) {
    var params = {
        TableName: 'mytable',
        Key: {count:{S:"mycount"}},
        AttributeUpdates: {
            mycount: {
                Action: 'ADD',
                Value: {N: '1'}
            }
        }
    };

    dynamodb.updateItem(params, function(err, data){
        if(err) {
            context.done('error' + err);
        } else {
            context.succeed();
        }
    })
};

その後諏訪さんのレビューを受けた際に、updateItemのパラメータにAttributeUpdatesを使うのは非推奨であるとの指摘を頂きました。

ドキュメントを見ると、確かにそのように書いてあります。

There is a newer parameter available. Use UpdateExpression instead.

そこで、推奨されているUpdateExpressionを使って以下のように書きなおしました。

var aws = require('aws-sdk');
var dynamodb = new aws.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = function(event, context) {
    var params = {
        TableName: 'mytable',
        Key: {count:{S:'mycount'}},
        UpdateExpression: 'set #count = #count + :i',
        ExpressionAttributeNames: {'#count': 'mycount'},
        ExpressionAttributeValues: {':i': {'N': '1'}}
    };

    dynamodb.updateItem(params, function(err, data) {
        if(err) {
            context.done('error' + err);
        } else {
            context.succeed();
        }
    })
};

どちらのLambda Functionも同じように動作します。

個人的には、パラメータで指定するよりも式で書けたほうが、分かりやすくて好みです。

updateItemだけでなく、putItemでも条件を記述する方法がConditionalOperatorではなくConditionExpressionが推奨されているようでした。