删除cosmos中的部分记录

问题描述 投票:0回答:1

需要有关删除具有 12 个属性的记录集的帮助

  1. 我有一个分区键为年份的集合项目
  2. 我有大约 100 万行,因为我想删除属性 source="ABC" 的记录,该记录将有 50 万行
  3. 我打算使用存储过程批量删除来做到这一点
  4. https://azurecosmosdb.github.io/labs/dotnet/labs/07-transactions-with-continuation.html使用了批量删除脚本

我看到的问题是当我尝试执行存储过程时,它要求 2 个输入

  • a) 分区键值
  • b) 查询

即使我提供分区键一些值和与提供的分区键值无关的查询,所以它不会根据我的 where 子句查询删除

select *
from c
where c.source="ABC"

如何实现我的场景?

执行后不影响任何记录

stored-procedures azure-cosmosdb azure-cosmosdb-sqlapi
1个回答
0
投票

删除cosmos中部分记录:

说明:

  • DeleteItemsWithNewId
    删除具有
    newId
    值的记录的方法。

  • 函数

    DeleteItemsWithNewId
    创建参数化查询以在搜索结果中选择具有特定 newId 的项目。

  • DeleteItemsWithNewId
    使用构建的查询创建
    QueryDefinition
    并设置参数值。

  • 该方法运行查询并使用

    queryIterator
    返回结果页面。

  • 使用

    DeleteItemAsync
    方法,它循环查询结果并从容器中删除每个项目。

我尝试过的代码:

static async Task Main(string[] args)
{
  CosmosClient cosmosClient = new CosmosClient(EndpointUrl, AuthorizationKey, new CosmosClientOptions() { AllowBulkExecution = true });
  Microsoft.Azure.Cosmos.Database database = cosmosClient.GetDatabase(DatabaseName);
  Microsoft.Azure.Cosmos.Container container = database.GetContainer(ContainerName);
  await DeleteItemsWithNewId(container, 50);
}

private static async Task DeleteItemsWithNewId(Microsoft.Azure.Cosmos.Container container, int targetNewId)
{
  var query = $"SELECT * FROM c WHERE c.newId = @newId";
  var queryDefinition = new QueryDefinition(query).WithParameter("@newId", targetNewId);
  var queryIterator = container.GetItemQueryIterator<Item>(queryDefinition);

  while (queryIterator.HasMoreResults)
  {
    var response = await queryIterator.ReadNextAsync();
    foreach (var item in response.Resource)
     {
       await container.DeleteItemAsync<Item>(item.id, new PartitionKey(item.pk));
     }
  }
}

输出

删除前计数: enter image description here

删除后计数enter image description here

  • 对于大型集合,此方法比使用

    stored procedure
    更可取,因为
    stored procedure
    只能在集合的单个分区上运行。

  • 使用

    stored procedure
    将需要多次调用,因为它只能对集合的一个分区进行操作。

  • 这些众多的电话将根据我们收集的金额来决定。

  • 因此,我使用上述方法来删除批量记录。

© www.soinside.com 2019 - 2024. All rights reserved.