本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
对表查询结果分页
DynamoDB 分页来自 Query
操作的结果。利用分页,Query
结果将分成若干“页”大小为 1 MB(或更小)的数据。应用程序可以先处理第一页结果,然后处理第二页结果,依此类推。
单次 Query
只会返回符合 1 MB 大小限制的结果集。要确定是否存在更多结果,并一次检索一页结果,应用程序应执行以下操作:
-
检查低级别
Query
结果:-
如果结果包含
LastEvaluatedKey
元素并且非空,请继续步骤 2。 -
如果结果中没有
LastEvaluatedKey
,则表示没有其他要检索的项目。
-
-
构造新的
Query
请求,使用与前一个请求相同的参数。但是,此次获取来自步骤 1 的LastEvaluatedKey
值,并将其用作新Query
请求中的ExclusiveStartKey
参数。 -
运行新的
Query
请求。 -
前往步骤 1。
换言之,LastEvaluatedKey
响应中的 Query
应该用作下一 ExclusiveStartKey
请求的 Query
。如果 LastEvaluatedKey
响应中没有 Query
元素,则表示您已检索最后一页结果。如果 LastEvaluatedKey
不为空,并不一定意味着结果集中有更多数据。检查 LastEvaluatedKey
是否为空是确定您是否已到达结果集末尾的唯一方式。
您可以使用 Amazon CLI 来查看此行为。会向 DynamoDB 重复 Amazon CLI 发送低级别Query
请求,LastEvaluatedKey
直到结果中不再出现。以以下 Amazon CLI 示例为例,该示例检索特定年份的电影标题。
aws dynamodb query --table-name Movies \ --projection-expression "title" \ --key-condition-expression "#y = :yyyy" \ --expression-attribute-names '{"#y":"year"}' \ --expression-attribute-values '{":yyyy":{"N":"1993"}}' \ --page-size 5 \ --debug
通常,它会自动 Amazon CLI 处理分页。但是,在本示例中, Amazon CLI --page-size
参数限制了每页的项目数。--debug
参数输出有关请求和响应的低级别信息。
如果您运行该示例,DynamoDB 的首次响应类似如下内容。
2017-07-07 11:13:15,603 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":5,"Items":[{"title":{"S":"A Bronx Tale"}}, {"title":{"S":"A Perfect World"}},{"title":{"S":"Addams Family Values"}}, {"title":{"S":"Alive"}},{"title":{"S":"Benny & Joon"}}], "LastEvaluatedKey":{"year":{"N":"1993"},"title":{"S":"Benny & Joon"}}, "ScannedCount":5}'
响应中的 LastEvaluatedKey
指示并未检索所有项目。 Amazon CLI 然后向 DynamoDB 发出另一个Query
请求。此请求和响应模式继续,直到收到最终响应。
2017-07-07 11:13:16,291 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":1,"Items":[{"title":{"S":"What\'s Eating Gilbert Grape"}}],"ScannedCount":1}'
如果不存在 LastEvaluatedKey
,则表示没有其他要检索的项目。
注意
这些软件开发 Amazon 工具包处理低级 DynamoDB 响应(包括有无响应LastEvaluatedKey
),并为分页结果提供各种抽象。Query
例如,SDK for Java 文档接口提供 java.util.Iterator
支持,以便您能够一次处理一个结果。
对于各种编程语言的代码示例,请参阅本地化的Amazon DynamoDB 入门指南和 Amazon SDK 文档。
此外,您还可以通过使用 Query
操作的 Limit
参数来限制结果集中的项目数,以此减少页面大小。
有关用 DynamoDB 查询的更多信息,请参阅DynamoDB 中的查询操作。