Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用节点sdk的唯一密钥策略在CosmosDB上强制执行唯一密钥?_Javascript_Node.js_Typescript_Azure_Azure Cosmosdb - Fatal编程技术网

Javascript 如何使用节点sdk的唯一密钥策略在CosmosDB上强制执行唯一密钥?

Javascript 如何使用节点sdk的唯一密钥策略在CosmosDB上强制执行唯一密钥?,javascript,node.js,typescript,azure,azure-cosmosdb,Javascript,Node.js,Typescript,Azure,Azure Cosmosdb,我有一个CosmosDB容器,它使用属性a和属性B的组合来确定项目的唯一性。容器的分区键是“id”字段中的guid。最近,我遇到了一个竞争条件,它添加了两个具有相同属性a和B但ID不同的条目。我尝试使用node sdk中的唯一密钥策略修复此问题,如下所示: export function getContainerDefinition(containerId: string) : ContainerDefinition { let indexingPolicy : CompositeInd

我有一个CosmosDB容器,它使用属性a和属性B的组合来确定项目的唯一性。容器的分区键是“id”字段中的guid。最近,我遇到了一个竞争条件,它添加了两个具有相同属性a和B但ID不同的条目。我尝试使用node 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 Emulator添加了两个具有相同属性A和B但ID不同的条目。我无法在设置中看到唯一密钥策略,因此我唯一的方法是在创建容器之前添加一个console.log,以确保正确应用了该策略(这是正确的)。有没有办法强制使用唯一键,这样我就不能添加两个具有相同属性a和B的不同ID的项


非常感谢您的帮助。

问题是您正在使用
/id
作为分区键定义

唯一密钥策略适用于每个分区键值(),这意味着它检查在一个分区键值内,没有两个文档具有所述属性的相同值


我还修复了这个问题,将属性A设置为分区键,然后为属性A和B添加了一个唯一的键策略。如果您想将其添加到您的答案中。”