在波斯菊中批量删除

时间:2020-05-11 17:20:17

标签: azure-cosmosdb bulk

我正在使用新的SDK进行“批量”删除。

new CosmosClientOptions() { AllowBulkExecution = true }

我想删除文档中特定日期超过3年的所有内容;即

Select  c.id,
        c.nameofPartitionKeyField 
from    c 
where   c.InvoiceDate < 3 years ago --???

我不能在这里使用“生存时间”,因为所有文档都是在一年前加载的,这是最近三年的信息。但是现在,一年后,我们要删除已有四年的物品。

我首先要查询以获取所需的id和分区密钥:

tasks.Add(container.DeleteItemStreamAsync(item.id.ToString(), new PartitionKey(item.pk.ToString()))

然后

await Task.WhenAll(tasks);

但是无论我做什么,如果我选择20条或30条以上的记录,则会收到429个过多的请求。如果我一次只能做20条记录,这看起来就不像“批量”。但是我一定做错了。我将按照我看到的所有示例进行操作,但是没有人提供删除示例,只能插入。无论如何,它应该没有太大的不同。

我确实有一个存储过程,该存储过程可以继续执行,并且会不断删除项目,但是看起来很慢。我需要删除大约600万个文档。这似乎没有做到或很快完成。

2 个答案:

答案 0 :(得分:0)

note from the docs

如果根据数据量配置的请求单位比预期的要低得多,则可能需要考虑将其设置为较高的值。批量操作将花费更长的时间,但是由于重试次数增加,完全成功的可能性更高。

因此,听起来像是一个完整的解决方案:

  1. MaxRetryAttemptsOnRateLimitedRequests设置为较高的值。
  2. 使用SemaphoreSlim或类似方法在客户端限制批量大小。

或者,您可以在每个TTL上设置一个短的TTL,然后让CosmosDb使用“剩余” RU自动删除它们。

答案 1 :(得分:0)

您可以尝试Bulk Executor Lib SDK,它具有BulkDelete功能。

这里是document

这里是GitHub上的sample

希望它可以为您提供帮助。