首页 > 解决方案 > 当 PK 为 id 且 UK 为 id 和版本时,如何在 cosmos db 中维护不同版本的 JSON 文档

问题描述

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

我收藏的分区键是deviceIdentity.

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

喜欢:

deviceIdentity1, v1
deviceIdentity1, v2

应该有两份文件。

问题是因为我的 PK 是deviceIdentity,它总是更新现有的记录,即使我已经定义了一个唯一的键约束deviceIdentityversion

在此处输入图像描述

任何指针都会有所帮助!

标签: azure-cosmosdbazure-cosmosdb-sqlapi

解决方案


我相信你partition keyprimary key.

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

主键是您的文档身份(字段id)。正如您已经注意到的,只能有 1 个带有 given 的文档idid对于要存储的每个文档,该字段必须是唯一的。在您的情况下,您可以使用组合值,例如"deviceIdentity1, v2"身份。或者,您可以使用技术唯一 ID,例如 guid。

另请注意,通过Azure Cosmos DB 中的唯一键

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

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


推荐阅读