AWS Lambda DynamoDBでauto incrementを実装する【nodejs】
DynamoDBではauto incrementの利用方法が少し難しいです。 おそらく、ソートキーにauto incrementを設定したいパターンが多いと思います。 方法としては、各テーブルのレコード数を管理するテーブルを作成し、その値を更新、取得し利用する感じです。 まずは、レコード数を管理するシーケンステーブルを作成します。 テーブル名は、「sequence」としておきましょう。 primary key(主キー)は、「name」とします。 このカラムには、どのテーブルを管理するか、テーブル名を入れます。 そのため、型はStringとします。 テーブルが作成できたら、レコードを作成します。 name に管理するテーブル名。 current_numberに0を設定します。 こちらには、各テーブルのレコード数を保存します。 準備はこれで終わりです。 次は、lambdaでの処理を記述していきます。
見本
'use strict';
var aws = require('aws-sdk');
var docClient = new aws.DynamoDB.DocumentClient();
exports.handler = function (event, context) {
var table = 'テーブル名';
sequence(table, function(id) {
var item = {
id:id
};
var params = {
TableName: table,
Item: item
};
docClient.put(params, function (err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
}
});
});
};
function sequence(sequenceName, callback) {
const params = {
TableName: "sequence",
Key: {
name: sequenceName
},
UpdateExpression: "set current_number = current_number + :val",
ExpressionAttributeValues: {
":val":1
},
ReturnValues: "UPDATED_NEW"
};
docClient.update(params, function(err, data) {
let id;
if (err) {
console.error('Unable to update item. Error JSON:', JSON.stringify(err, null, 2));
} else {
console.log('UpdateItem succeeded:', JSON.stringify(data, null, 2));
id = data.Attributes.current_number;
}
callback(id);
});
}
参考:https://qiita.com/naoki\_koreeda/items/4fa3daa7812410c10cf8 こちらの処理を実行することで、管理される側のテーブルのidが1ずつインクリメントされるようになります。 また管理するテーブルを増やす場合には、seaquenceテーブルに管理するテーブルのレコードを追加します。
なぜauto incrementを実装するのか
これは、人にとって理由は様々かと思いますが、ほとんどはソートキーを利用するためなのだと思います。 DynamoDBでは、データを取得した際に、そのデータの順番は決まっておらず、ランダムで取得されてしまいます。 しかし、ソートキーを設定すれば、勝手にその順番にソートしてくれるため、DBの取り扱いがしやすくなります。