如何在Cosmos DB中组合多键创建合成分区键
Cosmos DB C# 实现TypeId与CValue合成分区键方案
实现思路
Cosmos DB 本身不支持自动跨字段生成分区键,你需要手动将两个字段的值按固定规则拼接成新的分区键字段,写入文档前添加到文档对象中即可,同时要保证容器的分区键路径和你新增的字段路径一致。
调整后的代码示例
using Newtonsoft.Json.Linq; var content = JsonConvert.DeserializeObject<JObject>(lines); // 1. 取出两个用于生成分区键的字段值 string typeId = content.SelectToken("Classes.Subjects.TypeId")?.Value<string>(); JArray cValueArray = content.SelectToken("Classes.Sections.CValue")?.Value<JArray>(); // 2. 格式化CValue数组为字符串,可自定义分隔符,不要和后续的字段分隔符重复 string cValueStr = cValueArray != null ? string.Join("_", cValueArray.Values<int>()) : string.Empty; // 3. 拼接生成合成分区键,#作为字段分隔符,避免值拼接歧义 string syntheticPartitionKey = $"{typeId}#{cValueStr}"; // 4. 将合成分区键添加到文档中,此处添加在根节点 content.Add("syntheticPartitionKey", syntheticPartitionKey); var client = new DocumentClient(new Uri(DbInstance), Key); await client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(Database, Collection), content);
注意事项
- 提前在Cosmos DB对应容器的配置中,将分区键路径设置为
/syntheticPartitionKey,和代码中新增的字段路径保持一致 - 选择的字段分隔符、数组元素分隔符要确保不会出现在TypeId的取值、CValue的元素取值中,避免不同的字段组合生成相同的分区键
- 新增的合成分区键字段可以放在文档任意层级,只要容器的分区键路径对应即可,比如放在Classes节点下的话路径就是
/Classes/syntheticPartitionKey
内容的提问来源于stack exchange,提问作者ZZZSharePoint
相关产品推荐
相关产品推荐

