AWSのdynamoDBでは1度のクエリで取ってこれるデータの最大容量が 1MBとなっています。
これを超える場合1度にデータを全部取ってくることができないので複数回に分けてクエリを投げないといけません。
クエリ内で再帰関数を渡してあげれば簡単にいけました。
query.js
const aws = require("aws-sdk");
const dynamodb = new aws.DynamoDB.DocumentClient({ region: "ap-northeast-1" });
const queryToBigData = (params) => {
const result = [];
dynamodb.query(params, onQuery);
function onQuery(err, data) {
if (err) {
console.error(err);
return Promise.reject(err);
} else {
if (result.length !== 0) {
data["Items"].forEach(item => {
result[0].push(item);
});
} else {
result.push(data.Items);
}
if (typeof data.LastEvaluatedKey !== "undefined") {
params.ExclusiveStartKey = data.LastEvaluatedKey;
dynamodb.query(params, onQuery);
} else {
console.log("データ全部取れたよ");
return Promise.resolve(result);
}
}
}
}
data.LastEvaluatedKey
に取りきれなかったデータの最初の位置が入るのでこれに値が入っている限りデータを取り続けます。
paramsのExclusiveStartKeyに取り始める位置を入れてあげることで途中からクエリを投げてくれるみたいです。