使用Lambda(node.js)-如何删除Dynamodb表中的所有项目?
表中有50万行
我尝试使用扫描方法,然后遍历每个项目,然后使用删除方法。它最多只允许3000行。
代码
exports.handler = function(context, callback) {
getRecords().then((data) => {
data.Items.forEach(function(item) {
deleteItem(item.Id).then((data1) => {
});
});
});
};
var deleteItem = function(id) {
var params = {
TableName: "TableName",
Key: {
"Id": id
},
};
return new Promise(function(resolve, reject) {
client.delete(params, function(err, data) {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
function getRecords() {
var params = {
TableName: 'TableName',
IndexName: 'Type-index',
KeyConditionExpression: 'Type = :ty',
ExpressionAttributeValues: {
':ty': "1"
},
ProjectionExpression: "Id",
};
return new Promise(function(resolve, reject) {
client.query(params, function(err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
答案 0 :(得分:1)
扫描操作消耗读取容量。每次读取都返回up to 4 kb of data。当达到此限制时,扫描仅返回找到的内容。如果需要更多,则需要发出另一个扫描请求。
这将需要两个循环:1)循环以删除每次扫描返回的所有记录; 2)循环进行多次扫描,直到到达表格末尾为止
请确保使用一致的读取或在发出另一扫描之前等待1或2秒,否则您可能会在不同的扫描中得到重复的项目。
exports.handler = function(context, callback) {
clearRecords();
};
clearRecords = function() {
getRecords().then((data) => {
data.Items.forEach(function(item) {
deleteItem(item.Id).then((data1) => {});
});
clearRecords(); // Will call the same function over and over
});
}
观察到Lambda的超时限制为5分钟。由于您的表中有500K项,因此Lambda可能会超时,并且您需要多次触发它。例如,您也可以在4:50之后进行Lambda调用,例如,仅查看用于触发Lambda函数的AWS SDK文档。
答案 1 :(得分:1)
已经有一个正确答案,但这里有另一个代码片段,用于从 Dynamo DB 中删除所有记录。
const AWS = require("aws-sdk");
AWS.config.update({
region: "us-east-1",
});
const docClient = new AWS.DynamoDB.DocumentClient();
const getAllRecords = async (table) => {
let params = {
TableName: table,
};
let items = [];
let data = await docClient.scan(params).promise();
items = [...items, ...data.Items];
while (typeof data.LastEvaluatedKey != "undefined") {
params.ExclusiveStartKey = data.LastEvaluatedKey;
data = await docClient.scan(params).promise();
items = [...items, ...data.Items];
}
return items;
};
const deleteItem = (table, id) => {
var params = {
TableName: table,
Key: {
id: id,
},
};
return new Promise(function (resolve, reject) {
docClient.delete(params, function (err, data) {
if (err) {
console.log("Error Deleting ", id,err);
reject(err);
} else {
console.log("Success Deleting ", id,err);
resolve();
}
});
});
};
exports.handler = async function (event, context, callback) {
try {
const tableName = "<table>";
// scan and get all items
const allRecords = await getAllRecords(tableName);
// delete one by one
for (const item of allRecords) {
await deleteItem(tableName, item.id);
}
callback(null, {
msg: "All records are deleted.",
});
} catch (e) {
callback(null, JSON.stringify(e, null, 2));
}
};