Cosmos SQL 更新插入未按预期工作

Art*_*nis 5 java azure-cosmosdb azure-cosmosdb-sqlapi

如果我尝试使用已存在的 id 和分区键插入文档,如果容器上没有设置唯一约束,它会按预期工作。

但是,当我将表中的任何值设置为唯一值时,upsert 不起作用并且我得到一个(409 冲突 - 一个 id 与文档的 id 字段匹配的文档已经存在)。在这种情况下,唯一约束不应该是问题,但它会导致此错误,它对 upsert 有一个奇怪的错误描述,因为 id 是否已经存在应该无关紧要。

我正在使用documentClient.upsertDocument(collectionLink, documentDefinition, null, true);.

Mat*_*nta 6

Cosmos DB 的 Upsert / Replace 流程基于文档的唯一标识符(id 和 Partition Key 值),Unique Fields 用于添加额外的数据验证检查。

当进行 Upsert 操作时,服务将查找具有相同 id 和 Partition Key 值的现有文档,如果有则更新它,否则将创建它。

在您的情况下,您总是发送一个新的随机 ID,因此 Upsert 没有找到要更新的现有文档,而是每次都创建一个新文档。

请在启动 Upsert 之前定义您自己的 id,并将 upsert 调用中的 autogenerate id 属性设置为其默认 (true) 值:client.upsertDocument(collectionLink, documentDefinition)

  • 是的,您可以拥有许多具有相同分区键值的文档,但该分区键值中的“id”不相同。检查 DocumentClientException 以了解什么是失败。如果您还使用唯一键,则可能会在某些唯一键约束中产生冲突。 (2认同)