如何使用节点 sdk 的唯一密钥策略在 CosmosDB 上实施唯一密钥?
How to enforce unique keys on CosmosDB using the unique key policy with the node sdk?
我有一个 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 的两个项目?
感谢任何帮助。
问题是您正在使用 /id
作为您的分区键定义。
唯一键策略适用于每个分区键值 (https://docs.microsoft.com/azure/cosmos-db/unique-keys),这意味着它会检查在一个分区键值内,没有 2 个文档具有与所述 property/properties 相同的值。
我有一个 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 的两个项目?
感谢任何帮助。
问题是您正在使用 /id
作为您的分区键定义。
唯一键策略适用于每个分区键值 (https://docs.microsoft.com/azure/cosmos-db/unique-keys),这意味着它会检查在一个分区键值内,没有 2 个文档具有与所述 property/properties 相同的值。