【问题标题】:Add an attribute to every item in a DynamoDB table with millions of items为包含数百万个项目的 DynamoDB 表中的每个项目添加一个属性
【发布时间】:2019-08-17 04:49:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 没有更简单的方法,但是给定的方法也会有问题,比如如果应用程序也试图写入表怎么办?您可以做的另一件事是,不要轻易更新所有项目,而是在请求时更新项目。
  • 如果另一个应用程序在扫描和更新发生的同时尝试写入表,您是否知道默认行为是什么?是否会首先获取该项目的成功,但随后尝试进行更新的第二个将失败?

标签: amazon-dynamodb


【解决方案1】:
  1. 是的,这听起来很合理,但并不理想,但很合理
  2. 当然,总有更好的方法,但这是一种简单的方法,这是我作为本地 JS 文件运行的一个 sn-p...

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

祝你好运!

【讨论】:

  • 这真是帮助满满。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2020-10-11
相关资源
最近更新 更多