ドキュメントクライアントのBatchWriteItemコマンドの使い方。 BatchWriteItem コマンドでは、データの保存と削除ができます。
参考
書き込み(PutRequests)
書き込みでは、BatchWriteCommandInput型を以下のようにします。
{
RequestItems: {
"テーブル名": [
{
PutRequest: {
Item: { 保存データ },
},
},
...
]
}
}
保存データは、キーバリュー形式になります。 パーティションキーは必須になります。 ソートキーを設定している場合はソートキーも必要になります。
例 PutRequestのサンプル
async function docBatchWriteItemPut() {
const tableName = getTableName();
const params: BatchWriteCommandInput = {
RequestItems: {
[tableName]: [
{
PutRequest: {
Item: { pk: '2024-10', sk: '2024-10-01' },
},
},
{
PutRequest: {
Item: { pk: '2024-10', sk: '2024-10-02' },
},
},
{
PutRequest: {
Item: { pk: '2024-10', sk: '2024-10-03' },
},
},
]
},
};
const command = new BatchWriteCommand(params);
const res = await docClient.send(command);
console.log("docBatchWriteItemPut: %o", res);
return res;
}
削除(DeleteRequests)
削除では、BatchWriteCommandInput型を以下のようにします。
{
RequestItems: {
"テーブル名": [
{
DeleteRequest: {
Key: { 削除データ},
},
},
...
]
}
}
削除データの指定は、キーバリュー形式になります。 パーティションキーは必須になります。 ソートキーを設定している場合はソートキーも必要になります。
例
async function docBatchWriteItemPut() {
const tableName = getTableName();
const params: BatchWriteCommandInput = {
RequestItems: {
[tableName]: [
{
DeleteRequest: {
Key: { pk: '2024-10', sk: '2024-10-02' },
},
},
...
]
},
};
const command = new BatchWriteCommand(params);
const res = await docClient.send(command);
console.log("docBatchWriteItemDelete: %o", res);
return res;
}
制限
BatchWriteCommandには制限があり、書き込みと削除で1度に25個以上の指定はできないことです。
参考
そのためデータが多い場合、BatchWriteCommandはデータの分割処理が必要になります。 AWSのサンプルでは、以下のchunkArray関数が使われているので、これを使って分割します。
function* chunkArray<T>(arr: T[], stride = 1) {
for (let i = 0; i < arr.length; i += stride) {
yield arr.slice(i, Math.min(i + stride, arr.length));
}
}
参照
分割書き込み
例
async function docBatchWriteItemPut(start: Date, end: Date) {
const items = getItems(start, end);
const putRequests = items.map((v) => ({
PutRequest: {
Item: { pk: v.pk, sk: v.sk }
}
}));
const result = [];
const tableName = getTableName();
const list = chunkArray(putRequests, 25);
for (const chunk of list) {
const params: BatchWriteCommandInput = {
RequestItems: {
[tableName]: chunk,
},
};
const command = new BatchWriteCommand(params);
const res = await docClient.send(command);
result.push(res);
}
console.log("docBatchWriteItemPut: %o", result);
return result;
}
分割削除
例
async function docBatchWriteItemDelete(start: Date, end: Date) {
const items = getItems(start, end);
const deleteRequests = items.map((v) => ({
DeleteRequest: {
Key: { pk: v.pk, sk: v.sk }
}
}));
const result = [];
const tableName = getTableName();
const list = chunkArray(deleteRequests, 25);
for (const chunk of list) {
const params: BatchWriteCommandInput = {
RequestItems: {
[tableName]: chunk,
},
};
const command = new BatchWriteCommand(params);
const res = await docClient.send(command);
result.push(res);
}
console.log("docBatchWriteItemDelete: %o", result);
return result;
}