CosmosDB SQL API仍在尝试获取分区列表及其大小

时间:2018-06-07 20:22:10

标签: azure-cosmosdb azure-cosmosdb-sqlapi

我在StackOverflow上看到了一堆答案,声称微软的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个子对象,每个对象都有一个整数值。我不确定它们是什么,但它们可能是分区和大小吗?是否有更好的方式将它们拉出来?

1 个答案:

答案 0 :(得分: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时正确扩展的系统。