#amazon-dynamodb
#amazon-dynamodb
Вопрос:
Я довольно новичок в AWS, но мне нужно добавить атрибут (и присвоить значение чему-либо) к каждому отдельному элементу в таблице DynamoDB.
Я пытаюсь написать универсальный скрипт, который сможет делать это с любой переданной в него таблицей.
После небольшого изучения, похоже, я смогу сделать это, просто выполнив сканирование таблицы, получив элементы, а затем обновив каждый отдельный элемент.
Мои вопросы: (1) Кажется ли это разумным подходом? (2) Есть ли более простой / лучший способ сделать это автоматически? (добавление атрибута для всей таблицы к каждому элементу в таблице?)
Комментарии:
1. более простого подхода не существует, однако данный подход также будет иметь проблемы, например, что, если приложение также пытается выполнить запись в таблицу? Еще одна вещь, которую вы можете сделать, это вместо того, чтобы сразу обновлять все элементы, обновлять элементы по мере их запроса.
2. Вы случайно не знаете, каково поведение по умолчанию, если другое приложение пытается выполнить запись в таблицу одновременно с выполнением сканирования и обновления? Добьется ли успеха тот, который первым доберется до элемента, но затем вторая попытка выполнить обновление завершится неудачей?
3. docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
Ответ №1:
- Да, это звучит разумно, не идеально, но разумно
- Конечно, всегда есть способ получше, но это простой способ, вот фрагмент, который я запустил как локальный 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();
Удачи!
Комментарии:
1. Это действительно полноценная помощь. Спасибо!