【问题标题】:How to check if database exists in Cosmos DB?如何检查 Cosmos DB 中是否存在数据库?
【发布时间】:2020-12-13 14:28:24
【问题描述】:

我正在尝试使用 Cosmos DB .NET 客户端编写一些代码来清除现有的 Cosmos 数据库并创建一个新结构。我想删除一个具有指定名称的数据库,以便它的所有集合都消失了,然后创建一个新的。但是,我看不到一种干净地检查数据库是否存在的方法。有 CreateIfNotExists 方法,但这不是我想要的。我想删除现有的数据库。我能想到的唯一方法是捕获 CosmosException 并检查 404 状态代码,但似乎应该有一些 API 来检查是否存在或一些结果对象。

【问题讨论】:

  • 您必须自己创建一个。你可以做client.ReadDatabaseAsync(...),如果它抛出DocumentClientException 404,那么它不存在。我只会创建一个包装 ReadDatabaseAsync 的扩展。

标签: azure azure-cosmosdb


【解决方案1】:

上面给出的解决方案的一个更现实的版本:

    async Task<bool> DoesDatabaseExist(CosmosClient client, string databaseId)
    {
        QueryDefinition query = new QueryDefinition(
            "select * from c where c.id = @databaseId")
                .WithParameter("@databaseId", databaseId);

        FeedIterator<dynamic> resultSet = client.GetDatabaseQueryIterator<dynamic>(query);
        
        while (resultSet.HasMoreResults)
        {
            FeedResponse<dynamic> response = await resultSet.ReadNextAsync();

            if (response.Count > 0) return true;
        }

        return false;
    }

【讨论】:

    【解决方案2】:

    您可以查询 Cosmos DB 以查看数据库是否存在,而无需在 try 块中执行 Get。这是执行此操作的代码。

    QueryDefinition query = new QueryDefinition(
        "select * from c where c.id = @databaseId")
        .WithParameter("@databaseId", "database1");
    
        FeedIterator<dynamic> resultSet = client.GetDatabaseQueryIterator<dynamic>(query);
    
        List<dynamic> databases = new List<dynamic>();
        while (resultSet.HasMoreResults)
        {
            FeedResponse<dynamic> response = await resultSet.ReadNextAsync();
        }
    

    【讨论】:

      【解决方案3】:

      我相信官方SDK method 确定数据库是否存在是CosmosClient 上的CreateDatabaseIfNotExistsAsync,根据文档,如果存在,它将返回200 StatusCode。获得该结果后,您可以将其从引用中删除,如 this example 所示。

      // An object containing relevant information about the response
      DatabaseResponse databaseResponse = await client.CreateDatabaseIfNotExistsAsync(databaseId, 10000);
      
      // A client side reference object that allows additional operations like ReadAsync
      Database database = databaseResponse;
      
      ...
      
      // Delete the database from Azure Cosmos.
      await database.DeleteAsync();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多