typescript - 如何在打字稿中对 Lambda 函数的 DynamoDb 扫描结果进行分页?
问题描述
我在 DynamoDb 中的查询/扫描操作有问题。我正在使用dynamodb-data-mapper whit aws-data-mapper-annotations来对数据库进行操作。我有一个 Lambda 函数,它必须从一个表中获取所有项目(在这种情况下,我有一个标签表),我想对结果进行分页,并使用客户端指定的“限制”和“开始键”,因为标签表可能包含数十万条记录。所以我写了这样的东西:
import dbContext from '@dbModel/dbContext';
import Tag from '@dbModel/tables/tags';
import { ScanOptions } from '@aws/dynamodb-data-mapper';
const scanTag = async (filter: any): Promise<{
items: Tag[],
lastKey: Partial<Tag>
}> => {
let items: Tag[] = [];
let lastKey: Partial<Tag>;
const dbFilter: ScanOptions = {
limit: filter.limit,
startKey: {
id: filter?.startKey,
},
readConsistency: 'strong'
};
// use paginator because of the scan limit of 1MB
const paginator = dbContext.scan(Tag, dbFilter).pages();
for await (const page of paginator) {
items = items.concat(page);
lastKey = paginator.lastEvaluatedKey;
}
return Promise.resolve({
items: items,
lastKey: lastKey
});
};
export default scanTag;
这就是问题所在:扫描操作返回一个未排序的项目列表,所以我如何确保客户端的第二次调用(所以客户端已经收到了第一个'n'个项目并且他想要获得下一个' m' items) 将返回一组不同的项目?例如:第一次调用返回结果:[T5,T8,T1,T4],我想进行第二次调用,提供 T4 的键作为 startKey,我想确定没有 T5,T8,T1 或T4 在我的第二个回复中。
谢谢大家!
解决方案
推荐阅读
- arrays - 什么是空字符串的 Delphi 字节 ASM 表示?
- reactjs - ReactJS material-ui 输入验证
- azure - Terraform:当传入的变量是地图列表的列表时,如何迭代资源组中的名称或另一个变量?
- html - Bootstrap 5:如何使连续的卡片具有可变宽度?
- python-3.x - tkinter:在框架内放置一个文本字段
- python - 带有额外零的熊猫 to_csv
- python - 为什么这个 Tkinter 脚本说 tk 没有定义?
- dart - 哪些 Dart 运算符允许重载?
- python - 如何在 CSS 中正确设置网格以实现移动友好视图?(Python Dash 项目)
- c++ - 使用 rapidjson 解析 json 文件的最简单方法是什么?