2013-03-01 75 views
6

我一直在搜索和搜索一种方法来删除范围条件下具有相同ID的项目。 Table.DeleteItem的重载似乎没有一个范围条件,只有一个范围。按id和范围条件删除行?

是否有其他方法删除超过一个小时的所有条目?

我宁愿不必检索所有匹配的hashkey行,并按特定范围键手动删除每一行。

我主要使用.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(); 
} 

回答

4

此功能在DynamoDB中不存在。

您可以做的最好的办法是查询相应的项目并手动删除每个检索到的密钥。查询时只需要查询散列和范围键属性即可节省带宽,但请注意,这不会节省读取容量;当返回其属性的子集时,DynamoDB仍会向您收取该项目的全部大小。

有些人通过为每个时间段(通常是一天一小时)制作单独的表格来解决这个时间问题。通过删除表

  • 秤今天的表比其他
  • 这种“数据隔离”高不

    • 删除旧数据“免费”:这样,你可以做一些有趣的事情尽管看起来是因为DynamoDB的模型而不好。需要获得一个项目?你已经有了时间范围键,所以你知道要问哪个表。需要查询?你的范围条件必须是基于时间的,所以你知道要问哪些表。

    +0

    您不必返回所有字段 - 您可以指定要获取的属性 - 因为您要执行删除操作,所以只能获取散列/范围。 – FlavorScape 2013-03-04 19:10:20

    +0

    我发现很难理解为什么你可以在范围条件上查询但不能删除。在索引内存的线性系统中,它似乎非常简单。也许他们希望你消耗宝贵的带宽单位来删除。 – FlavorScape 2013-03-04 23:55:56

    +0

    @FlavorScape我想我在第一段中介绍了你的第一条评论;但请记住,即使仅获取哈希/范围,您仍然支付完整的项目大小。 – 2013-03-05 03:27:48