[ 后端篇 ] 09 - AWS DynamoDB Pagination(分页)
当数据量过多的时候,往往数据不能全部读取,需要进行分页读取,可以看到到DynamoDB API接口的限制: BatchGetItem 和 BatchWriteItem API都有数据的限制。
如何进行数据的分页处理呢?
官方文档也提供了详细的文档: 为结果分页 ,同时也可以参考 Dynamo DB Pagination ,解释的很到位。
DynamoDB 将对来自 Query/Scan 操作的结果分页。利用分页,Query 结果将分成若干“页”大小为 1 MB(或更小)的数据。应用程序可以先处理第一页结果,然后处理第二页结果,依此类推。
- 检查低级别 Query 结果: 如果结果包含 LastEvaluatedKey 元素,请继续步骤 2。 如果结果中没有 LastEvaluatedKey,则表示没有其他要检索的项目。
- 使用与上一个 Query 请求相同的参数构造新的 Query 请求 — 但此次,请选取步骤 1 中的 LastEvaluatedKey 值并将其用作新的 Query 请求中的 ExclusiveStartKey 参数。
- 运行新的 Query 请求。
- 前往步骤 1。
同时也找到官方提供 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") {