2013-03-01 12 views
6

Ho cercato e cercato un modo per eliminare elementi con lo stesso ID in base a una condizione di intervallo. Nessuno degli overload per Table.DeleteItem sembra richiedere una condizione di intervallo, solo un intervallo.Elimina righe per ID e condizioni di intervallo?

C'è qualche altro approccio per eliminare tutte le voci più vecchie di un'ora?

Preferirei non non dover recuperare tutte le righe hashkey corrispondenti e cancellare manualmente ogni riga dalla chiave intervallo specifico.

Principalmente sto usando .NET SDK ma qualsiasi suggerimento è apprezzato.

Vedo alcuni esempi di scrittura batch, ma nulla che richiede un'intera gamma.

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(); 
} 

risposta

4

Questa funzionalità non esiste in DynamoDB.

Il meglio che puoi fare è interrogare gli articoli appropriati e cancellare manualmente ogni chiave recuperata. È possibile risparmiare sulla larghezza di banda chiedendo solo gli attributi della chiave hash e dell'intervallo quando si esegue una query, ma si noti che ciò non risparmia sulla capacità di lettura; DynamoDB ti addebiterà comunque per l'intera dimensione dell'articolo quando restituirà un sottoinsieme dei suoi attributi.

Alcune persone hanno affrontato questo problema temporale creando una tabella separata per ciascun periodo di tempo (più generalmente un giorno di un'ora). In questo modo si può fare alcune cose interessanti:

  • eliminare i vecchi dati "gratis" facendo cadere il tavolo
  • Scala tavolo di oggi superiore rispetto al resto

Questa "segregazione di dati" non è così male come sembra dovuto al modello di DynamoDB. Hai bisogno di prendere un oggetto? Hai già la chiave di intervallo temporale, quindi sai quale tabella chiedere. Hai bisogno di interrogare? La tua condizione di intervallo deve essere basata sul tempo, quindi sai quali tabelle chiedere.

+0

Non è necessario restituire tutti i campi, è possibile specificare quali attributi ottenere: poiché si desidera eseguire un'eliminazione, si otterrà solo l'hash/intervallo. – FlavorScape

+0

Trovo difficile capire perché è possibile eseguire una query su una condizione di intervallo ma non eliminare. Sembra piuttosto semplice in un sistema lineare di memoria indicizzata. Forse vogliono che tu consumi loro preziose unità di larghezza di banda da eliminare. – FlavorScape

+0

@FlavorScape Penso di aver coperto il tuo primo commento nel primo paragrafo; ma ricorda che paghi comunque la dimensione completa dell'articolo anche se ottieni solo l'hash/intervallo. –