AWS DynamoDB 中按任意页码分页

问题描述 投票:0回答:1

我正在创建由 AWS Api Gateway 触发的 DynamoDB Scan lambda,并尝试实现分页。据我所知,为了做到这一点,我需要在响应中发送

LastEvaluatedKey
,然后使用该密钥作为
ExclusiveStartKey

但是,这样,我无法实现类似部分的内容来选择页面,因为我永远不知道有多少页面以及每个页面上有哪些产品(我需要获取第 1 页的项目才能知道第 2 页是否开始) .

如何解决这个问题并搜索特定页面的项目?我的意思是,对于像这样的复杂数据库来说,不为开发人员提供实际执行此操作的方法似乎很奇怪。必须有一个有效的解决方案。

这是 lambda 函数的一个非常简化的版本:

import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
import { DynamoDBDocumentClient, ScanCommand, type ScanCommandInput } from '@aws-sdk/lib-dynamodb';
import { type Handler, type APIGatewayProxyEvent, type APIGatewayProxyResult } from 'aws-lambda';

const client = new DynamoDBClient();
const docClient = DynamoDBDocumentClient.from(client);

export const handler: Handler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
    const { queryStringParameters } = event;
    try {
        const page = queryStringParameters?.page || 1; // Get the page number from the query string parameters
        const pageSize = 5;

        // Define the parameters for the scan operation
        const params: ScanCommandInput = {
            TableName: 'Products',
            Limit: pageSize,
            ExclusiveStartKey: exclusiveStartKey // how to define exclusiveStartKey?
        };

        const { Items, LastEvaluatedKey } = await docClient.send(new ScanCommand(params));
        return {
            statusCode: 200,
            body: JSON.stringify({
                products: Items,
                nextPage: LastEvaluatedKey ? Number(page) + 1 : null // how to define nextPage?
            })
        };
    } catch (err) {
        // Handle errors
    }
};
amazon-web-services aws-lambda pagination amazon-dynamodb dynamodb-queries
1个回答
0
投票

DynamoDB 不是一个复杂的数据库,您使用 Scan API 创建 API 的事实让我想知道您为什么使用 DynamoDB。

根据您的访问模式以及决定支付哪种费用的需要,也许关系数据库而不是 NoSQL 数据库更适合......

如果您的内容是静态的,您可以给它一个页码分区键,这样无论您访问哪个页面,您都可以高效地执行此操作,并且每次都能获得完全相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.