はじめに
RDBMSを使っていると、allとかで全件取得出来て特に気にする必要がないのですが、DynamoDBでは1MBまでのデータ量の件数のみしか取得が出来ないので、知っていないとあれ全件取得出来ていない...みたいなことになり私のように痛い目にあってしまうので、自分への戒めの意味も込めて残しておきます。
情報ソース:DynamoDB でのスキャンの使用
環境
- Nodejs
実装
const AWS = require('aws-sdk');
const DynamoDB = new AWS.DynamoDB.DocumentClient({region: "ap-northeast-1"});
const tableName = 'hoges';
module.exports.hello = async (event, context) => {
try {
// scan用のパラメーターをセット
const params = {
TableName: tableName
}
// scanで取得したデータを格納する空の配列を定義しておく
let items = []
const scan = async () => {
const result = await DynamoDB.scan(params).promise()
items.push(...result.Items)
// scanリクエストを行なった時にLastEvaluatedKeyがあれば、再帰的にリクエストを繰り返す
if (result.LastEvaluatedKey){
params.ExclusiveStartKey = result.LastEvaluatedKey
await scan()
}
}
await scan()
const count = items.length
for (let i = 0; i < count; i++){
console.log(`id: ${items[i]['id']}`)
}
console.log(`Execution result: ${count}`)
} catch (err) {
console.error(`[Error]: ${JSON.stringify(err)}`)
return err
}
}