[在运行select之前检查容器/集合是否存在

问题描述 投票:1回答:1

我有一个多租户波斯菊数据库。每个租户都有自己的容器。我是宇宙的新手,所以如果我的任何说法正确,请随时纠正我。

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中?

DocumentDbRepository.cs

此方法引发错误。它陷入了一般的例外。不像我想的那样出现在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容器/集合。不完全确定这个名词对宇宙我是个陌生的人

enter image description here

以下内容似乎是要设置一个容器,但事实是我知道它不存在。在我致电请求之前,必须有一种检查方法。或至少发现问题在于集合ID无效。

var container = _cosmosDatabase.GetContainer(collectionId);
c# azure .net-core azure-cosmosdb
1个回答
0
投票

如果使用SDK,则可以使用以下方法

DocumentClient.CreateDatabaseIfNotExistsAsyncDocumentClient.CreateDatabaseIfNotExistsAsync

编辑

您可以通过有条件(或无条件)的查询来获取列表中的所有容器信息。

DocumentClient.CreateDocumentCollectionIfNotExistsAsync

然后您可以验证它是否存在,没有可用的直接方法

您可以通过以下方法获取收藏夹,

DocumentClient.CreateDocumentCollectionIfNotExistsAsync
© www.soinside.com 2019 - 2024. All rights reserved.