当PK为id且UK为id和version时,如何在cosmos db中维护不同版本的JSON文档

时间:2018-06-08 11:40:23

标签: azure-cosmosdb azure-cosmosdb-sqlapi

我有一个包含两个属性deviceIdentity, version的JSON文档。

我的收藏品的分区键是deviceIdentity

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

像:

deviceIdentity1, v1
deviceIdentity1, v2

应该有两份文件。

问题是因为我的PK是deviceIdentity,所以即使我在deviceIdentityversion上定义了一个唯一的键约束,它仍然会更新现有记录。

enter image description here

任何指针都会有所帮助!

2 个答案:

答案 0 :(得分:0)

我认为您将partition keyprimary key混淆。

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

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

另请注意,按Unique keys in Azure Cosmos DB

  

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

如果您的分区键为deviceIdentity,则表示您不必在唯一约束部分中复制deviceIdentity/version上的约束足以确保每个分区/设备每个版本最多只有一个文档。

答案 1 :(得分:0)

感谢所有答案。

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

因此,只要文档附带不同的版本,它就会更新为cosmos中的“id”具有预定义,即任何到达文档的UPSERT都是在唯一ID值上完成的,在我们的例子中,id永远不会是唯一的。

我们找到了解决方案。

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