无法通过 sdk 从 cosmos db 中删除特定文档?

Unable to delete specific document from cosmos db via sdk?

我正在按照以下代码使用 DeleteDocumentAsync。

 public static void DeleteErrorLog(List<string> LogID, string collectionName)
        {
            FeedOptions queryOptions = new FeedOptions { EnableCrossPartitionQuery = true };
            try
            {
                //getting resource id for a document with given logid

                var db = client.CreateDatabaseQuery().Where(x => x.Id == databaseName).ToList().First();
                var coll = client.CreateDocumentCollectionQuery(db.SelfLink).Where(x => x.Id == collectionName).ToList().First();
                var docs = client.CreateDocumentQuery(coll.SelfLink, queryOptions).Where(x => x.Id == LogID[0]).AsEnumerable().Single();
                var collectionUri = UriFactory.CreateDocumentUri(databaseName, collectionName, docs.ResourceId);
                client.DeleteDocumentAsync(collectionUri);

            }
            catch (Exception) { throw; }
        }

每个值都正确填充,我得到了我需要删除的文档仍然无法删除它?非常感谢任何帮助

您可能缺少删除操作的 PartitionKey:

var documentUri = UriFactory.CreateDocumentUri(databaseName, collectionName, LogID[0]);
client.DeleteDocumentAsync(documentUri, new RequestOptions(){PartitionKey=new PartitionKey(LogID[0])}).GetAwaiter().GetResult();

此外,如果您已经知道 ID,在您的情况下是 LogID[0],则不需要查询。

您没有等待 client.DeleteDocumentAsync,这意味着您的 catch 将不会捕获在创建的 Task 中发生的异常 - 它会默默地失败。

我的猜测是因为这个原因,在DeleteDocumentAsync中抛出了一个异常,随后没有在预期的地方被捕获。

理想情况下,此方法将被重写为使用 async/await,然后您的 try catch 将拾取任何抛出的异常:

public static async Task DeleteErrorLog(List<string> LogID, string collectionName)
{
    ...
    await client.DeleteDocumentAsync(collectionUri);
    ...
}

您必须确保调用此方法的代码也使用 await.