我在dynamodb中有100行数据和一个带有路径的api api/get/{number}
现在当我说number=1API应该返回前10个值。当我说number=2时,它应该返回接下来的10个值。我对query、lastevaluatedkey和sort by进行了类似的操作 createdOn
. 现在的用例是,如果用户在number=2之后传递number=10,那么lastevaluatedkey仍然是第2页的键,结果将是第3页的数据。如何直接获取数据。此外,如果用户从数字=3变为数字=1,数据仍将不属于第1页。
我用它来进行基于html分页的api调用。
我正在使用Java1.8和 aws-java-sdk-dynamodb
.
1条答案
按热度按时间nkhmeac61#
在dynamodb中,非顺序分页是很困难的—如果需要始终保持高效的操作,就必须围绕它设计数据模型。对于您的具体案例,我需要关于数据和访问模式的更多细节。
一般来说,您可以选择设置
ExclusiveStartKey
属性,该属性类似于关系数据库中的偏移量,但只是相似而不完全相同。这个ExclusiveStartKey
是继续查询的键,表示表中的数据而不仅仅是数字。这意味着你通常猜不到它,除非它是一个连续的数字-这是不理想的。
对于顺序分页,即用户从第1页转到第2页,从第2页转到第3页等等。您可以将其作为令牌传递到请求中,但如果用户从第3页转到第2页或只是随机导航到第14页,则这将不起作用。
在您的案例中,您只有有限的数据量—100个项目,因此我针对您的具体案例的解决方案是查询所有项目并限制响应中的项目量
n * 10
,在哪里n
是结果页。然后将结果中的最后10项返回给客户。这是一个解决方案,将在规模(时间+成本)虽然昂贵,幸运的是没有多少人会使用分页到第7页或第8页虽然(你可以埋在谷歌搜索结果的第2页正文)。
yan cui在hackernoon上写了一篇关于这个问题的有趣文章,你可能想看看。