我有一个多租户波斯菊数据库。每个租户都有自己的容器。我是宇宙的新手,所以如果我的任何说法正确,请随时纠正我。
var collection = $"{tenant}.expense";
我正在尝试查询此集合中的数据。
var documentRep = new DocumentDbRepository(_storageInfo);
var collection = $"{tenant}.expense";
var sql = $"SELECT VALUE COUNT(1) FROM (SELECT DISTINCT c.UserName FROM c WHERE((c.Created >= '{startDate:yyyy-MM-dd}T00:00:00' or c.Modified >= '{startDate:yyyy-MM-dd}T00:00:00') and (c.Created <= '{endDate:yyyy-MM-dd}T23:59:00' or c.Modified <= '{endDate:yyyy-MM-dd}T23:59:00'))) AS x";
var cnt = await documentRep.QueryCountAsync(collection, sql);
但是如果承租人实际上不存在,则cosmos返回404。是否有一种方法可以在运行select之前检查容器是否确实存在于文档rep中?
此方法引发错误。它陷入了一般的例外。不像我想的那样出现在DocumentclientException中。
在一段时间内没有结果,我希望结果为0,但这不是问题,因为要发送的租户实际上对该数据库无效,因此不存在。
public class DocumentDbRepository
{
private readonly Database _cosmosDatabase;
public DocumentDbRepository(StorageInfo storageInfo)
{
var databaseId = storageInfo.AzureCosmosDb.Collection;
var endpoint = storageInfo.AzureCosmosDb.Uri;
var key = storageInfo.AzureCosmosDb.Key;
var cosmosClient = new CosmosClient(endpoint, key);
_cosmosDatabase = cosmosClient.GetDatabase(databaseId);
}
public async Task<int> QueryCountAsync(string collectionId, string sql)
{
try
{
var container = _cosmosDatabase.GetContainer(collectionId);
var queryDefinition = new QueryDefinition(sql);
var queryResultSetIterator = container.GetItemQueryIterator<int>(queryDefinition);
var currentResultSet = await queryResultSetIterator.ReadNextAsync();
return currentResultSet.FirstOrDefault();
}
catch (DocumentClientException e)
{
//NOTE: the error does not catch here
if (e.StatusCode == HttpStatusCode.NotFound)
{
return 0; //
}
else
{
throw;
}
}
catch (Exception e)
{
// Error caught here.
Console.WriteLine(e);
throw;
}
}
}
}
响应状态代码未指示成功:404子状态:0原因:(消息:{“错误”:[“未找到资源”]}ActivityId:18569a9-b155-44e1-9248-be86c291b9b5,请求URI:/ apps / 4867e06-ea60-4691-bcbc-6f423aac702d / services / 829b605-5f0c-4728-bbfe-e4696e42f253 / partitions / 1249694-b944-486b-b3a4- db72b8534085 / replicas / 32156515793694366s,RequestStats:RequestStartTime:2019-10-16T06:44:51.7346321Z,RequestEndTime:2019-10-16T06:44:51.7346321Z,尝试区域数:1响应时间:2019-10-16T06:44:51.7346321Z,StoreResult:StorePhysicalAddress:rntbd://10.0.0.26/apps/4867e06-ea60-4691-bcbc-6f423aac702d/services/0829b605-5f0c-4728-bbfe-e4696e42f253/partitionss / 1249694-b944-486b-b3a4-db72b8534085 / replicas / 32156515793694366s,LSN:40,GlobalCommittedLsn:40,PartitionKeyRangeId:,IsValid:True,StatusCode:404,SubStatusCode:0,RequestCharge:1,ItemLSN:-1,SessionToken:- 1#40,UsingLocalLSN:False,TransportException:空,ResourceType:集合,OperationType:读取响应时间:2019-10-16T06:44:51.7346321Z,StoreResult:StorePhysicalAddress:rntbd://10.0.0.24/apps/67e06-ea60-4691-bcbc-6f423aac702d/services/0829b605-5f0c-4728-bbfe-e4696e42f253/partitionss / d1249694-b944-486b-b3a4-db72b8534085 / replicas / 32156612013279478s,LSN:40,GlobalCommittedLsn:40,PartitionKeyRangeId:,IsValid:True,StatusCode:404,SubStatusCode:0,RequestCharge:1,ItemLSN:-1,SessionToken:- 1#40,UsingLocalLSN:False,TransportException:空,ResourceType:集合,OperationType:读取,SDK:Microsoft.Azure.Documents.Common / 2.7.0,Windows / 10.0.18362 cosmos-netstandard-sdk / 3.3.0)。
我需要能够检查tem是否没有.expense容器/集合。不完全确定这个名词对宇宙我是个陌生的人
以下内容似乎是要设置一个容器,但事实是我知道它不存在。在我致电请求之前,必须有一种检查方法。或至少发现问题在于集合ID无效。
var container = _cosmosDatabase.GetContainer(collectionId);
如果使用SDK,则可以使用以下方法
DocumentClient.CreateDatabaseIfNotExistsAsync
DocumentClient.CreateDatabaseIfNotExistsAsync
编辑
您可以通过有条件(或无条件)的查询来获取列表中的所有容器信息。
DocumentClient.CreateDocumentCollectionIfNotExistsAsync
然后您可以验证它是否存在,没有可用的直接方法
您可以通过以下方法获取收藏夹,
DocumentClient.CreateDocumentCollectionIfNotExistsAsync