当数据量过多的时候,往往数据不能全部读取,需要进行分页读取,可以看到到DynamoDB API接口的限制:
BatchGetItem 和 BatchWriteItem API都有数据的限制。
如何进行数据的分页处理呢?
官方文档也提供了详细的文档: 为结果分页,同时也可以参考Dynamo DB Pagination,解释的很到位。
DynamoDB 将对来自 Query/Scan 操作的结果分页。利用分页,Query 结果将分成若干“页”大小为 1 MB(或更小)的数据。应用程序可以先处理第一页结果,然后处理第二页结果,依此类推。
同时也找到官方提供aws-doc-sdk-examples的 Node.js DynamoDB Pagination Demo 。如下:
javascript/example_code/dynamodb/GettingStarted/Node.js/MoviesScan.js
//代码主要Snippets
var params = {
TableName: "Movies",
ProjectionExpression: "#yr, title, info.rating",
FilterExpression: "#yr between :start_yr and :end_yr",
ExpressionAttributeNames: {
"#yr": "year",
},
ExpressionAttributeValues: {
":start_yr": 1950,
":end_yr": 1959
}
};
console.log("Scanning Movies table.");
docClient.scan(params, onScan);
function onScan(err, data) {
if (err) {
console.error("Unable to scan the table. Error JSON:", JSON.stringify(err, null, 2));
} else {
// print all the movies
console.log("Scan succeeded.");
data.Items.forEach(function(movie) {
console.log(
movie.year + ": ",
movie.title, "- rating:", movie.info.rating);
});
// continue scanning if we have more movies, because
// scan can retrieve a maximum of 1MB of data
// 检测LastEvaluatedKey字段,判断是否有下一页,采用递归的方式处理。
if (typeof data.LastEvaluatedKey != "undefined") {
console.log("Scanning for more...");
params.ExclusiveStartKey = data.LastEvaluatedKey;
docClient.scan(params, onScan);
}
}
}