我使用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,
};
}
怎么了?为什么我没有得到所有需要的物品?
下面的示例按预期工作。我将 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();
结果: