この記事は公開されてから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が推奨されているようでした。