向包含数百万个项目的 DynamoDB 表中的每个项目添加一个属性



我是 AWS 的新手,但我需要为 DynamoDB 表中的每个项目添加一个属性(并将值设置为某些内容(。

我正在尝试编写一个通用脚本,该脚本将能够对传入的任何表执行此操作。

经过一番挖掘,看起来我应该能够通过扫描表格、获取项目,然后更新每个项目来做到这一点。

我的问题是:(1(这似乎是一个合理的方法吗?(2(有没有更简单/更好的方法来自动执行此操作?(在表范围内向表中的每个项目添加一个属性?

  1. 是的,这听起来很合理,不理想,但合理
  2. 当然,总有更好的方法,但这是一种简单的方法,这是我作为本地 JS 文件运行的片段......

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient({
    region:'us-east-1'
});
async function main(event, context) {
    let tableContents;
    try{
        //get items from dynamo
        const params = {
            TableName: `${YOUR_TABLE_NAME}`,
        };
        tableContents = await scanDB(params);
    }catch(err){
        console.log(err);
        return err;
    }
    let calls = [];
    tableContents.forEach(function(value){
        let params = {
            ExpressionAttributeValues: {
                ":newAttribute": false,
            },
            Key: {
                "indexKey": value.indexKey
            },
            TableName: `${YOUR_TABLE_NAME}`,
            UpdateExpression: "SET newAttribute = :newAttribute",
            };
        calls.push(dynamoDb.update(params).promise());
    });
    let response;
    try{
        response = await Promise.all(calls);
    }catch(err){
        console.log(err);
    }
    return response;
}
async function scanDB(params) {
    let dynamoContents = [];
    let items;
    do{
        items =  await dynamoDb.scan(params).promise();
        items.Items.forEach((item) => dynamoContents.push(item));
        params.ExclusiveStartKey  = items.LastEvaluatedKey;
    }while(typeof items.LastEvaluatedKey != "undefined");
    return dynamoContents;
};
main();

祝你好运!

最新更新