【问题标题】:How do I define unique keys involving properties in embedded arrays in Azure Cosmos DB?如何定义涉及 Azure Cosmos DB 中嵌入数组中的属性的唯一键?
【发布时间】:2020-04-19 23:08:09
【问题描述】:

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

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

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

我希望组名在逻辑分区中是唯一的,因此我添加了一个路径为 /groupName 的唯一键。

我还想确保成员是唯一的,即相同的userId 值不会在给定组内多次出现。天真地,我可能会尝试使用路径 /name/members/userId 创建一个唯一键。但这不起作用,唯一键似乎没有效果。

我尝试了几种不同的变体,但都没有达到我预期的效果。

所以我的问题:

  1. 是否可以创建“遍历”嵌入对象数组的唯一键?
  2. 如果是,那么正确的路径语法是什么?
  3. 鉴于唯一键的意思是“在整个逻辑分区中唯一”而不是“在整个文档中唯一”,如果我真的确实设法定义了一个涉及属性的唯一键会发生什么嵌入的members 对象,并试图保存两个成员都为零的不同组?这些键是否不会在逻辑上对两个组都评估为nullundefined,从而阻止我保存其中一个?

感谢您提供任何有助于解决此问题的见解!

【问题讨论】:

    标签: azure azure-cosmosdb azure-cosmosdb-sqlapi


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 Mark 解决这个问题。我怀疑是这种情况,但认为要求为可能想知道的其他人明确记录它是有用的。
    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多