【问题标题】:How to enforce unique keys on CosmosDB using the unique key policy with the node sdk?如何使用节点 sdk 的唯一密钥策略在 CosmosDB 上强制执行唯一密钥?
【发布时间】:2021-02-12 03:19:31
【问题描述】:

我有一个 CosmosDB 容器,它使用属性 A 和属性 B 的组合来确定项目的唯一性。容器的分区键是“id”字段中的 guid。最近,我遇到了一个竞争条件,它添加了两个具有相同属性 A 和 B 但 ID 不同的条目。我尝试使用节点 sdk 中的唯一密钥策略来解决此问题,如下所示:

export function getContainerDefinition(containerId: string) : ContainerDefinition
{
    let indexingPolicy : CompositeIndexingPolicy = {};
    let uniqueKeyPolicy: UniqueKeyPolicy = {
        uniqueKeys: []
    };
    if (containerId.includes("ab"))
    {
        const path : IndexedPath[] = [  { "path":"/a"}, { "path":"/b"} ];
        indexingPolicy = {
            compositeIndexes: [ path ]
        };
        uniqueKeyPolicy = {
            uniqueKeys: [
                { paths: ['/a', '/b'] }
            ]
        }
    }

    let partitionKey = { kind: "Hash", paths: ["/id"] };
    if (containerId.includes("user"))
    {
        partitionKey = { kind: "Hash", paths: ["/email"] };
    }

    return {
        id: containerId,
        partitionKey: partitionKey,
        indexingPolicy: indexingPolicy,
        uniqueKeyPolicy: uniqueKeyPolicy
    };
}

创建容器后,我浏览了本地 Azure Cosmos DB 模拟器,并能够添加两个具有相同属性 A 和 B 但具有不同 ID 的条目。我无法在设置中看到唯一的密钥策略,所以我唯一的方法是在创建容器之前添加一个 console.log 以确保正确应用策略(这是)。有没有办法强制执行唯一键,这样我就不能添加具有相同属性 A 和 B 的具有不同 ID 的两个项目?

感谢任何帮助。

【问题讨论】:

  • 我还通过将属性 A 设为分区键来解决此问题,然后为属性 A 和 B 添加唯一的密钥策略。如果您想将其添加到您的答案中。'

标签: javascript node.js typescript azure azure-cosmosdb


【解决方案1】:

问题是您使用/id 作为您的分区键定义。

唯一键策略适用于每个分区键值 (https://docs.microsoft.com/azure/cosmos-db/unique-keys),这意味着它检查在一个分区键值内,不是 2 个文档具有相同的所述属性值。

【讨论】:

    猜你喜欢
    • 2020-07-28
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2010-09-08
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多