能否为同一容器/分区内不同类型文档创建专属唯一键约束?
问题:Cosmos DB 不同文档类型的唯一键约束配置
在同一容器(container)和分区(partition)中存储以下两类文档,通过Type属性区分文档类型(DocumentA或DocumentB):
class DocumentA { public Guid Id { get; set; } public Guid ParitionKey { get; set; } public string Name { get; set; } public string Type { get; set; } } class DocumentB { public Guid Id { get; set; } public Guid ParitionKey { get; set; } public int Value { get; set; } public string Type { get; set; } }
请问是否可以创建仅适用于DocumentA或DocumentB的唯一键约束?例如,能否为DocumentA的Name属性创建唯一键约束,同时为DocumentB的Value属性创建另一项唯一键约束?
答案
Azure Cosmos DB的唯一键约束是容器级别的,默认会作用于容器内所有文档,但可以通过组合唯一键的方式实现针对不同文档类型的专属唯一约束:
- 针对
DocumentA的Name属性:定义复合唯一键为(/Type, /Name),这样在同一分区内,所有Type="DocumentA"的文档中,Name值会保持唯一; - 针对
DocumentB的Value属性:定义另一项复合唯一键为(/Type, /Value),同一分区内所有Type="DocumentB"的文档中,Value值会保持唯一。
这种配置下,不同类型文档的目标属性仅在自身类型范围内生效,不会互相干扰——比如DocumentA的某个Name值和DocumentB的某个Value值相同,不会触发唯一键冲突,因为Type属性作为组合键的一部分,会区分开两类文档。
需要注意两个关键点:
- 唯一键约束必须在容器创建时定义,容器创建完成后无法修改;
- 对于不包含对应属性的文档(比如
DocumentA没有Value字段),Cosmos DB会将缺失属性视为null,但由于我们把Type纳入了组合键,不同类型的null情况不会产生冲突。
内容的提问来源于stack exchange,提问作者WBuck
相关产品推荐
相关产品推荐

