向具有数百万个项目的DynamoDB表中的每个项目添加属性

时间:2019-03-26 17:45:03

标签: amazon-dynamodb

我对AWS来说还很陌生,但是我需要为DynamoDB表中的每个单个项目添加一个属性(并将值设置为某种值)。

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

经过一些挖掘,看来我应该能够做到这一点,只需扫描表,获取项目,然后更新每个项目即可。

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

1 个答案:

答案 0 :(得分:1)

  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();

祝你好运!