无法通过 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
.
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
.