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

时间:2019-10-31 18:05:53

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

enter image description here我正在按照以下代码使用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; }
        }

每个值都正确填充,我要删除的文档仍然无法删除吗?任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您不等待client.DeleteDocumentAsync,这意味着您的catch将不会捕获所创建的Task中发生的异常-它会自动失败。

我的猜测是由于这个原因,在DeleteDocumentAsync中引发了一个异常,该异常随后未在预期的位置被捕获。

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

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

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