Удалить строки по идентификатору и условию диапазона?

Я искал и искал способ удалить элементы с тем же идентификатором по условию диапазона. Ни одна из перегрузок для Table.DeleteItem, похоже, не принимает условие диапазона, только диапазон.

Есть ли другой подход к удалению всех записей старше часа?

Я бы предпочел не извлекать все совпадающие строки хэш-ключа и вручную удалять каждую строку с помощью определенного ключа диапазона.

Я в основном использую .NET SDK, но приветствую любые подсказки.

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

private static void SingleTableBatchWrite()
{
  Table productCatalog = Table.LoadTable(client, "ProductCatalog");
  var batchWrite = productCatalog.CreateBatchWrite();

  var book1 = new Document();
  book1["Id"] = 902;
  book1["Title"] = "My book1 in batch write using .NET Helper API";
  book1["ISBN"] = "902-11-11-1111";
  book1["Price"] = 10;
  book1["ProductCategory"] = "Book";
  book1["Authors"] = new List<string> { "Author 1", "Author 2", "Author 3" };
  book1["Dimensions"] = "8.5x11x.5";
  batchWrite.AddDocumentToPut(book1);
  // Specify delete item using overload that takes PK. 
  batchWrite.AddKeyToDelete(12345);
  Console.WriteLine("Performing batch write in SingleTableBatchWrite()");
  batchWrite.Execute();
}

person FlavorScape    schedule 01.03.2013    source источник


Ответы (1)


Этой функции нет в DynamoDB.

Лучшее, что вы можете сделать, - это запросить соответствующие элементы и вручную удалить каждый полученный ключ. Вы можете сэкономить на пропускной способности, запрашивая при запросе только атрибуты хэша и ключа диапазона, но учтите, что это не экономит на емкости чтения; DynamoDB по-прежнему будет взимать плату за полный размер элемента при возврате подмножества его атрибутов.

Некоторые люди решили эту временную проблему, создав отдельную таблицу для каждого временного периода (чаще дня, чем часа). Таким образом вы сможете делать кое-что интересное:

  • Удалите старые данные «бесплатно», отбросив таблицу
  • Масштабируйте сегодняшнюю таблицу выше, чем остальные

Это «разделение данных» не так плохо, как кажется из-за модели DynamoDB. Нужен предмет? У вас уже есть временной ключ диапазона, поэтому вы знаете, какую таблицу запрашивать. Нужен запрос? Ваше условие Range должно быть основано на времени, чтобы вы знали, какие таблицы запрашивать.

person Cory Kendall    schedule 04.03.2013
comment
Вам не нужно возвращать все поля - вы можете указать, какие атрибуты получить - поскольку вы хотите выполнить удаление, вы получите только хэш / диапазон. - person FlavorScape; 04.03.2013
comment
Мне трудно понять, почему вы можете запрашивать условие диапазона, но не удалять. Это кажется довольно простым в линейной системе индексированной памяти. Может быть, они действительно хотят, чтобы вы потратили на их удаление драгоценные единицы полосы пропускания. - person FlavorScape; 05.03.2013
comment
@FlavorScape Я думаю, что рассмотрел ваш первый комментарий в первом абзаце; но помните, что вы все равно платите за полный размер элемента, даже если получаете только хэш / диапазон. - person Cory Kendall; 05.03.2013
comment
У меня создалось впечатление, что внутри все запросы являются асинхронными, и вам никогда не нужно получать весь объект, почему они будут взимать плату за атрибуты, которые никогда не извлекались? - person FlavorScape; 12.03.2013
comment
@FlavorScape Не знаю почему; однако, поигравшись с ним, я заметил, что они есть. Интересно, связано ли это с использованием памяти на их стороне? Думаю, это где-то задокументировано, посмотрю, смогу ли потом откопать. - person Cory Kendall; 12.03.2013
comment
Ссылка из DynamoDB, подтверждающая удаление только одной записи за раз: docs .aws.amazon.com / amazondynamodb / latest / developerguide / Если они изменят эту функцию в будущем, мы надеемся, что эта страница будет отмечена на этой странице. - person Sarah Messer; 26.02.2019