使用Lambda删除Dynamodb中的所有项目吗?

时间:2018-06-29 23:06:52

标签: node.js aws-lambda amazon-dynamodb

使用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);
      }
    });
  });
}

2 个答案:

答案 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));
  }
};