Удалить все элементы в Dynamodb, используя Lambda? - PullRequest
0 голосов
/ 30 июня 2018

Использование Lambda (node.js) - как удалить все элементы в таблице Dynamodb?

В таблице 500К строк

Я попытался использовать метод сканирования, а затем перебрать каждый элемент, а затем использовать метод удаления. Это позволяет только до 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);
      }
    });
  });
}

1 Ответ

0 голосов
/ 30 июня 2018

A Операция сканирования потребляет емкость чтения. Каждое чтение возвращает до 4 КБ данных . Когда этот лимит достигнут, Сканирование возвращает только то, что было найдено до тех пор. Если вам нужно больше, вам нужно отправить еще один запрос на сканирование.

Для этого вам понадобятся два цикла: 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, например, просто взгляните на документацию AWS SDK для запуска лямбда-функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...