【问题标题】:Trying to delete a row from Cosmos DB in C# code尝试在 C# 代码中从 Cosmos DB 中删除一行
【发布时间】:2020-09-08 18:29:40
【问题描述】:

我正在尝试从 Cosmos db 容器中删除一行。我只有身份证。 PartitionKey 不同,即类别列。但是我在删除时没有类别值。我是 Cosmos DB 的新手。有什么方法可以执行此操作吗?

 var task = await this.MainContainer.DeleteItemAsync<T>(id, new PartitionKey("Category1"));

【问题讨论】:

  • 为什么在删除之前不检索项目?
  • 它的多笔交易。有没有其他办法。我猜这是一个缺点。如果我们总是知道分区键怎么办。
  • 通常的做法是检索所有分区并将其保存在内存中,然后对所有分区并行(或批量)运行多个删除命令。另外请澄清是否可以从所有分区中删除或仅删除。
  • 我想从所有分区中删除。保留在内存中意味着什么?

标签: c# .net azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

如果您不知道分区键的值并且文档确实有分区字段,请使用EnableCrossPartitionQuery属性启用跨分区查询。

然后,通过Id 查询您的文档并获取它的SelfLink 属性。使用此 SelfLink 值删除您的文档。

代码:

FeedOptions queryOptions = new FeedOptions
        {
            MaxItemCount = 10,
            EnableCrossPartitionQuery = true
        };
        var id = '1';
        var queryString = "SELECT * FROM c WHERE c.id= '" + id + "'";
        var queryInSql = documentDbClient.CreateDocumentQuery<Document>(
                               "uri",
                               queryString,
                               queryOptions).AsDocumentQuery();
        var document = await queryInSql.ExecuteNextAsync<Document>().ConfigureAwait(false);

        //Delete a document using its selfLink property
        //To get the documentLink you would have to query for the Document, using CreateDocumentQuery(),  and then refer to its .SelfLink property
        await documentDbClient.DeleteDocumentAsync(document.AsEnumerable().FirstOrDefault().SelfLink);

【讨论】:

  • 这仅在文档的 id 在集合中是唯一的情况下才有效。我不确定 OP 是否可以确认在这种情况下是否属于这种情况。
  • 是的,你是对的@Krishnan。没有提到 Id 的唯一性,所以考虑到它是默认状态并且那里没有变化,我提供了这个答案。但是,如果id 不是唯一的,在这种情况下,解决方案会略有变化。
  • 但我不能这样写内联查询。我的代码是通用的
  • 配置和方法将保持不变,您必须将其转换为泛型。如果您可以提供您的查询和删除代码,我可以为您转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多