如何在 Azure Cosmos DB 的嵌入式数组中定义涉及属性的唯一键?

How do I define unique keys involving properties in embedded arrays in Azure Cosmos DB?

在 Azure Cosmos DB 中,支持唯一键。每个唯一键都被定义为一组表示存储文档中值的路径。这种路径的一个例子是 /contact/firstName。官方文档中并不清楚(实际上根本没有提到)这些路径如何通过文档中的嵌入式数组向下应用,或者当路径导航到基数大于一的嵌套文档时如何应用唯一键语义。

例如,假设我有一个这样的文档来存储一个用户组和一组成员用户:

{
  "id": "ABCD1234",
  "name": "Administrators",
  "members":
  [
    {
      "userId": 1,
      "enabled": true
    },
    {
      "userId": 2,
      "enabled": true
    }
  ]
}

我希望组名在整个逻辑分区中是唯一的,所以我添加了一个具有路径 /groupName 的唯一键。

我还想确保成员是唯一的,即相同的 userId 值不会在给定组中出现多次。天真地,我可能会尝试使用路径 /name/members/userId 创建一个唯一的密钥。但是那不行,唯一键好像没有作用。

我已经尝试了几种不同的变体,但其中 none 达到了我预期的效果。

所以我的问题:

  1. 是否可以创建唯一键 "traverse" 到嵌入对象数组中?
  2. 如果是,正确的路径语法是什么?
  3. 鉴于唯一键意味着 "unique across the whole logical partition" 而不是 "unique across the document",如果我实际上 did 设法定义涉及属性的唯一键会发生什么在嵌入的 members 对象上,并试图保存两个成员均为零的不同组?这些键是否不会在逻辑上对两组都评估为 nullundefined,从而阻止我保存其中一个?

感谢任何有助于解决这个问题的见解!

唯一键不会遍历文档中的数组,这就是为什么它们没有这样记录的原因。

有关什么是逻辑分区的详细信息,请参阅我们在 partitions

上的文档

如果您想要像您所描述的那样的唯一性,请在逻辑分区中创建不同的文档。