使用Lambda,boto3在DynamoDB上查询的SQL LIMIT OFFSET

时间:2019-05-22 23:42:05

标签: python aws-lambda amazon-dynamodb boto3

我对后端开发和AWS都是陌生的,我正在练习使用AWS LambdaDynamoDB构建api后端。基本上,客户端应该能够通过LambdaAPI Gateway发出http请求,然后Lambda会从DynamoDB中获取记录或将记录插入其中。

所以我卡住的部分是分页。想象一下像StackOverflow这样的Web应用程序,人们可以在那里问问题。该Web应用程序的后端有一个数据库表Questions,它看起来像这样:

  • QuestionId(String):随机哈希,分区键
  • Tag(String):为简单起见,假设每个问题只能有一个标签
  • 标题(字符串)
  • 内容(字符串)
  • CreatedAt(Number):排序键,自纪元以来创建的时间,以毫秒为单位。

现在我想拥有的是GET分页支持。该api应该能够以这种形式处理GET请求:

GET http://www.example.com/questions?tag=trees&page=21&pagesize=15

这应该返回第21页中有关树木的问题列表,其中每页最多包含15条记录。

就像StackOverflow分页一样:

https://stackoverflow.com/questions/tagged/amazon-web-services?sort=newest&page=21&pagesize=15

如果这是一个SQL表,我会做这样的事情:

SELECT * FROM Questions WHERE Tag=trees ORDER BY CreatedAt LIMIT 15 OFFSET (15*20)


我从教程和文档等中学到的是DynamoDB并不是那样工作的。看起来,如果查询要查询第5000页,Lambda需要从数据库中获取所有5000页,而只丢弃前4999页并返回最后一页。

从db返回的数据大小也有一定的限制,即1MB。这意味着,如果我在第一个数据库响应中找不到第5000页,则必须要求下一批。对于这样的通用功能,这似乎过于复杂,我觉得必须有更好的方法。

我对学习实际市场中针对上述问题的一般策略感兴趣。例如,StackOverflow实际上不需要花费任何时间就可以使用Java标签来获取第100000页。它不仅知道每个标签的最后页码。任何人都可以提供可以处理此类查询的适当的lambda示例代码吗?

0 个答案:

没有答案