我've had a read through AWS' s围绕分页的文档:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#ScanQueryLimit
正如他们的文档所述:
在响应中,DynamoDB返回Limit值范围内的所有匹配结果 . 例如,如果发出限制值为6且没有过滤器表达式的查询或扫描请求,DynamoDB将返回表中与请求中指定的键条件匹配的前六项(或仅返回前六项)扫描没有过滤器的情况)
这意味着,鉴于我有一个名为 Questions
的表,其中包含一个名为 difficulty
的属性(可以采用从 0
到 2
的任何数值),我可能会遇到以下难题:
-
客户提出请求,认为
GET /questions?difficulty=0&limit=3
-
我将
3
转发给DynamoDB查询,该查询可能返回0
项,因为集合中的前3个可能不是difficulty == 0
-
然后,我必须执行一个新查询以获取符合该条件的更多
questions
,而不知道我可能会返回重复项
然后我如何才能正确地基于查询进行分页?在我得到正确偏移的同时,我会得到尽可能多的结果
3 回答
查询和扫描操作在其响应中返回
LastEvaluatedKey
. 如果没有并发插入,您将不会错过项目,也不会多次遇到项目,只要您重复调用Query / Scan并将ExclusiveStartKey设置为上一次调用的LastEvaluatedKey即可 .下面是一个如何在Node.js中迭代DynamoDB
scan
(也可以很容易地适应query
)的分页结果集的示例 .您可以保存
LastEvaluatedKey
状态服务器端并将标识符传递回您的客户端,它将通过其下一个请求发送,并且您的服务器将在下一个请求中将该值传递为ExclusiveStartKey
到DynamoDB .你可以通过难度和查询集KeyConditionExpression做一个索引secundary,其中难度= 0.像这样