Node.js 是否使用Lambda删除Dynamodb中的所有项?

Node.js 是否使用Lambda删除Dynamodb中的所有项?,node.js,aws-lambda,amazon-dynamodb,Node.js,Aws Lambda,Amazon Dynamodb,使用Lambda(node.js)-如何删除Dynamodb表中的所有项 表中有500K行 我尝试过使用扫描方法,然后循环浏览每个项目,然后使用删除方法。它最多只允许3000行 代码 扫描操作会消耗读取容量。每次读取返回。当达到此限制时,扫描只返回它在到达之前找到的内容。如果需要更多,则需要发出另一个扫描请求 这需要两个循环:1)循环删除每次扫描返回的所有记录;2) 循环以保持多次扫描,直到到达表的末尾 确保使用一致的读取,或在发出另一次扫描之前等待1或2秒,否则可能会在不同的扫描中得到重复的项

使用Lambda(node.js)-如何删除Dynamodb表中的所有项

表中有500K行

我尝试过使用扫描方法,然后循环浏览每个项目,然后使用删除方法。它最多只允许3000行

代码


扫描操作会消耗读取容量。每次读取返回。当达到此限制时,扫描只返回它在到达之前找到的内容。如果需要更多,则需要发出另一个扫描请求

这需要两个循环:1)循环删除每次扫描返回的所有记录;2) 循环以保持多次扫描,直到到达表的末尾

确保使用一致的读取,或在发出另一次扫描之前等待1或2秒,否则可能会在不同的扫描中得到重复的项目


请注意,Lambda的超时限制为15分钟。因为您的表中有500K个项目,所以很可能Lambda将超时,您需要多次触发它。您也可以在4:50之后调用Lambda本身,例如,只需查看AWS SDK文档中有关触发Lambda函数的内容


已经有了一个正确的答案,但下面是另一个代码片段,用于删除Dynamo DB中的所有记录

const AWS=require(“AWS sdk”);
AWS.config.update({
地区:“us-east-1”,
});
const docClient=new AWS.DynamoDB.DocumentClient();
常量getAllRecords=async(表)=>{
设params={
TableName:table,
};
设项目=[];
让data=wait docClient.scan(params.promise();
items=[…items,…data.items];
while(type of data.LastEvaluatedKey!=“未定义”){
params.ExclusiveStartKey=data.LastEvaluatedKey;
data=wait docClient.scan(params.promise();
items=[…items,…data.items];
}
退货项目;
};
常量deleteItem=(表,id)=>{
变量参数={
TableName:table,
关键:{
id:id,
},
};
返回新承诺(功能(解决、拒绝){
docClient.delete(参数、函数(错误、数据){
如果(错误){
console.log(“删除错误”,id,err);
拒绝(错误);
}否则{
console.log(“删除成功”,id,err);
解决();
}
});
});
};
exports.handler=异步函数(事件、上下文、回调){
试一试{
const tableName=“”;
//扫描并获取所有项目
const allRecords=wait getAllRecords(tableName);
//逐条删除
用于(所有记录的常数项){
等待删除项(tableName,item.id);
}
回调(null{
msg:“所有记录均已删除。”,
});
}捕获(e){
回调(null,JSON.stringify(e,null,2));
}
};

查询(选择带有索引的特定字段)会比使用扫描便宜吗?如果您不介意发布代码,这将对我有帮助,而otherDynamo不会根据读取类型收取不同的费用,只会根据您消耗的读取次数收取不同的费用。目前,4kb的数据消耗一次读取(如果不一致,则为半次读取)。查询和扫描以相同的方式使用读取容量。只有当您需要表的一个子集时,查询才更便宜,这是一种直接获取您感兴趣的项的方法,而无需阅读表的其余部分。由于您无论如何都需要获取所有项目,因此使用查询或扫描将消耗相同的读取容量,即相同的金额。至于代码,请张贴您的,我们可以从那里开始?添加了一个建议,我的答案。您可以删除处理程序外部的逻辑,并使其在每次执行后调用自身。
clearRecords
函数也可以并行调用多次,但它会增加DynamoDB表中所需的保留吞吐量。修改为将clearRecords调用移到deleteItem循环之外,以便在每次getRecords调用结束时只调用一次。由于本文是编写的,lambda现在最多可以有15分钟的超时时间…您想清空表吗?Lambda不是最好的选择。与扫描/删除每个项目相比,更好的选择通常是简单地删除然后重新创建表。
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);
      }
    });
  });
}
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
  });
}