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の取り扱いがしやすくなります。
関連書籍