首页 > 解决方案 > 如何在打字稿中对 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 在我的第二个回复中。

谢谢大家!

标签: typescriptaws-lambdapaginationamazon-dynamodbdynamodb-queries

解决方案


推荐阅读