Azure cosmosdb 当PK是id,UK是id和version时,如何在cosmosdb中维护不同版本的JSON文档

Azure cosmosdb 当PK是id,UK是id和version时,如何在cosmosdb中维护不同版本的JSON文档,azure-cosmosdb,azure-cosmosdb-sqlapi,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我有一个JSON文档,它有两个属性deviceIdentity,version 我的集合的分区键是deviceIdentity 我的JSON文档有不同的版本,我想保留此文档的所有版本 比如: 应该有两份文件 问题是,因为我的PK是deviceIdentity,所以它总是在更新现有记录,即使我在deviceIdentity,version上定义了唯一的键约束 任何指点都会有帮助 我相信您将分区键与主键混淆了 分区键确定如何水平缩放数据。这不应该是唯一的,否则任何读取(精确文档查找除外)都需要扫描

我有一个JSON文档,它有两个属性
deviceIdentity,version

我的集合的分区键是
deviceIdentity

我的JSON文档有不同的版本,我想保留此文档的所有版本

比如:

应该有两份文件

问题是,因为我的PK是
deviceIdentity
,所以它总是在更新现有记录,即使我在
deviceIdentity
version
上定义了唯一的键约束


任何指点都会有帮助

我相信您将
分区键
主键
混淆了

分区键确定如何水平缩放数据。这不应该是唯一的,否则任何读取(精确文档查找除外)都需要扫描所有分区,这将非常高效。在您的情况下,
deviceIdentity
可能是一个合适的候选者-同一设备的所有版本将属于同一分区

主键是您的文档标识(字段
id
)。正如您已经注意到的,只有一个文档具有给定的
id
。每个要存储的文档的
id
字段必须是唯一的。在您的情况下,可以使用组合值,如
“deviceIdentity1,v2”
作为标识。或者,您可以使用技术上唯一的id,比如guid

此外,请注意:

通过在创建容器时创建唯一密钥策略,可以确保每个分区密钥的一个或多个值的唯一性


这意味着,如果分区键是
deviceIdentity
,则不必在唯一约束部分中复制
deviceIdentity
。对
/version
的约束足以确保每个分区/设备每个版本最多有一个文档。

谢谢所有的答案

问题是我们有一个旧的遗留系统,“id”是一个已经被大量使用的属性,但它没有唯一的值

因此,每当一个文档带有不同的版本时,它都会在cosmos中更新为“id”,这具有预定义的含义,即任何到达文档的上游都是在唯一的id值上完成的,在我们的情况下,id永远都不是唯一的

我们找到了解决方案


每当文档出现时,我们都在azure函数中处理它,并将“id”列与唯一的“deviceidentity”值交换值并保存它,因为JSON的结构不能像我们的客户所说的那样更改,在阅读这些文档时,我们已经公开了一个API,该API再次进行交换,并将文档原样发送给请求的客户。

您的意思是文档的id是deviceIdentity,可能它也有相同的分区。我说的对吗?您可以使用mu多个文档具有相同的partitionkey,但id只有一个文档。也可以选择向id添加版本。我有一个名为“id”的不同属性,分区位于“deviceIdentity”上。我们从一个来源获取此文档,您的意思是在Cosmos Db中插入文档时,我们操作id值并向其添加版本值吗?同意@RafatSarosh,将版本添加到id应该可以解决此问题。如果您将deviceIdentity作为partitionKey,则无需添加与文档id相同的版本。您可以使用版本字段r为此目的
deviceIdentity1, v1
deviceIdentity1, v2