0

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

我收藏的分区键是deviceIdentity.

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

喜欢:

deviceIdentity1, v1
deviceIdentity1, v2

应该有两份文件。

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

在此处输入图像描述

任何指针都会有所帮助!

4

2 回答 2

0

我相信你partition keyprimary key.

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

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

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

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

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

于 2018-06-13T07:23:05.757 回答
0

感谢所有的答案。

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

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

我们找到的解决方案。

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

于 2018-06-14T09:33:58.317 回答