【问题标题】:CosmosDB SQL API, still attempting to get list of partitions and their sizesCosmosDB SQL API,仍在尝试获取分区列表及其大小
【发布时间】:2018-06-07 20:22:09
【问题描述】:

我在 StackOverflow 上看到了一堆答案,指出 Microsoft 的 Cosmosdb 根本不支持获取分区键列表。这一直困扰着我,因为它似乎是任何数据存储的第一个要求,获取逻辑分区名称和大小的列表 - 任何其他数据存储都会给你诸如表大小之类的东西,我不敢相信微软将把它关掉。

我不认为他们会这样做,所以它不能被记录(或至少记录良好)。在以下代码中:

var client = new DocumentClient(
                    endpoint,
                    authKey

Database db = client.CreateDatabaseQuery().Where(d => d.Id == databaseName).AsEnumerable().FirstOrDefault();

//Sure is a lot of verbose faff.  Have to keep specifying things you've already basically specified when you initialized the client...
var collection = client.CreateDocumentCollectionQuery(databaseSelfLink).Where(c => c.Id == myCollectionName).ToArray().FirstOrDefault();

//This yields "/$pk" in the value - so I guess there's just one path, 
//but I still have a lot of distinct values in that path.  
//I try a DocumentQuery next to drill down.
var partitionKeys = collection.PartitionKey.Paths;  

var querySpec = new SqlQuerySpec("SELECT DISTINCT c.PartitionKey FROM c");
var test = client.CreateDocumentQuery(collection.SelfLink, querySpec);

当我在最后一行之后断点并查看测试对象时,我看到它有一个-k 个子对象,每个子对象都有一个整数值。我不确定这些是什么,但它们可以是分区和大小吗?有没有更好的办法把它们拉出来?

【问题讨论】:

  • 好的,我可能无法按预期返回结果 - 当我将 .ToArray()、.ToList()、.ToDictionary() 添加到查询末尾时,我得到了一个异常“语法错误,“DISTINCT”附近的语法不正确”,错误代码“SC1001”。一堆谷歌搜索让人们在论坛上谈论聚合查询在 CosmosDB 上不起作用。
  • 好的,我想我已经成功了。自从 CosmosDB 出现以来,人们一直在要求独特的 4 年(不知道为什么微软甚至发布了没有最基本功能的产品)。尽管 MS 表示它支持聚合,但 distinct 不在 CosmosDB SQL API 的聚合函数中。至少目前不是,根据我能找到的最新文档:docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sql-query
  • 这是该文档中聚合的确切标题 - 不支持 DISTINCT:docs.microsoft.com/en-us/azure/cosmos-db/…

标签: azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

我有一点答案,虽然不是一个完整的答案。因此,我不会将此问题标记为已回答。

我找到了这份文件:https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.documents.documentcollection.partitionkeyrangestatistics?view=azure-dotnet

这是一些修改后的代码,用于拉回分区和大小。根据上述文档,它只保证报告大于 1GB 的分区,尽管到目前为止我看到的最小报告分区是 42MB:

var client = new DocumentClient(
                    endpoint,
                    authKey
Database db = client.CreateDatabaseQuery().Where(d => d.Id == databaseName).AsEnumerable().FirstOrDefault();
var collection = client.CreateDocumentCollectionQuery(databaseSelfLink).Where(c => c.Id == myCollectionName).ToArray().FirstOrDefault();
collection = await client.ReadDocumentCollectionAsync(
            collection.SelfLink,
            new RequestOptions { PopulatePartitionKeyRangeStatistics = true });
        Console.WriteLine(collection.PartitionKeyRangeStatistics.ToString());

所以现在我要做的就是用报告的分区名称和大小解析字符串。关于动态创建新分区以使系统能够在使用完整配置的 RU 时正确扩展,我还有其他问题要回答。

【讨论】:

  • 我已经遇到了一个已填满的分区。我的计划是为该分区实现生存时间 - CosmosDB 提供了一项服务,可以在不占用 RU 的情况下删除已过期的文档。
猜你喜欢
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2023-02-04
相关资源
最近更新 更多