Dynamo 数据库分页node.js

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

我使用node.js和@aws-sdk/lib-dynamodb。 我想从带有分页的 dynamo 表中获取所有项目,但每个请求仅收到约 327 个项目,例如 400 个或更多项目。 dynamodb 有 750 个项目。

async getAllArtObjectIds(pageSize = 400, startKey) {
    const scanParams = {
        TableName: this.tableName,
        Limit: pageSize,
        ExclusiveStartKey: startKey,
    };

    const scanResults = [];
    let items;
    let itemsCount = 0;

    do {
        items = await this.docClient.send(new ScanCommand(scanParams));
        items.Items.forEach((item) => {
            scanResults.push({
                artObjectId: item.artObjectId,
                partitionKey: item.PartitionKey,
                isApproved: item.isApproved,
            });
        });

        console.log('item', items.Items.length);
        itemsCount += items.Items.length;
        scanParams.ExclusiveStartKey = items.LastEvaluatedKey;
    } while (items.LastEvaluatedKey);

    console.log('scan.len', scanResults.length);
    return {
        data: scanResults,
        lastEvaluatedKey: items.LastEvaluatedKey,
    };
}

怎么了?为什么我没有得到所有需要的物品?

node.js pagination amazon-dynamodb
1个回答
0
投票

下面的示例按预期工作。我将 400 个大件物品装入一个表中。 DynamoDB 的页面大小限制为 1MB,因此我每页可以容纳 17 个项目。

const { DynamoDBClient } = require("@aws-sdk/client-dynamodb");
const { DynamoDBDocumentClient, ScanCommand } = require("@aws-sdk/lib-dynamodb");
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);

const get = async () => {

    const startKey = null;
    const scanResults = [];
    let items;
    let itemsCount = 0;

    const scanParams = {
        TableName: 'test',
        Limit: 400,
        ExclusiveStartKey: startKey,
    };

    do {
        items = await docClient.send(new ScanCommand(scanParams));
        items.Items.forEach((item) => {
            scanResults.push(item);
        });

        console.log('item', items.Items.length);
        itemsCount += items.Items.length;
        scanParams.ExclusiveStartKey = items.LastEvaluatedKey;
    } while (items.LastEvaluatedKey);

    console.log('scan.len', scanResults.length);
    return {
        data: scanResults,
        lastEvaluatedKey: items.LastEvaluatedKey,
    };

}

get();

结果:

  • 23页共17项;
  • 1 页共 9 项;
  • 扫描长度400
© www.soinside.com 2019 - 2024. All rights reserved.