Java Cosmos SQL upsert未按预期工作

Java Cosmos SQL upsert未按预期工作,java,azure-cosmosdb,azure-cosmosdb-sqlapi,Java,Azure Cosmosdb,Azure Cosmosdb Sqlapi,如果我尝试使用已经存在的id和分区键来升级文档,那么如果容器上没有设置唯一的约束,它将按预期工作 但是,当我将表中的任何值设置为Unique时,upsert不起作用,我得到一个(409冲突-一个id与文档的id字段匹配的文档已经存在)。在这种情况下,唯一约束不应该是一个问题,但它会导致此错误,对于upsert有一个奇怪的错误描述,因为id是否已经存在并不重要 我正在使用documentClient.upsertDocument(collectionLink,documentDefinition,

如果我尝试使用已经存在的id和分区键来升级文档,那么如果容器上没有设置唯一的约束,它将按预期工作

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


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

Cosmos DB的Upsert/Replace流基于文档的唯一标识符(id和分区键值),唯一字段用于添加额外的数据验证检查

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

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


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

您的集合是否已分区?是否在每个upsertDocument方法上发送相同的id和分区键值?通过在upsertDocument方法上设置false标志自动分配id。两个请求的分区键相同,两个请求的唯一字段相同。我需要相同的请求来升级,因为我们有两个单独的云试图升级相同的请求。文档通过其Id和分区键值进行唯一标识,而不考虑唯一的字段配置。存在可添加额外检查的唯一字段。如果每次发送带有随机“id”的Upsert,则Upsert将始终创建不同的文档。对于Upsert执行更新/替换,您需要提供文档的id作为请求的一部分,而不是自动生成的id(这会使每次都有所不同)。但它给我的例外是id相同。这仅仅是使用随机生成的id和匹配的唯一值的误导效果吗?所以你是对的,我需要自己定义id,并对其他请求使用完全相同的id。这与异常消息所说的完全相反,这是相当误导的。请发布一个答案,我会将其标记为正确,谢谢!我需要插入一个新文档,当它被赋予一个新的“id”,但分区键与现有文档的分区键相同时。然而,它给了我一个DocumentClientException。为什么会这样?难道我不能拥有多个具有相同分区键值的文档吗?是的,您可以拥有许多具有相同分区键值的文档,但在该分区键值内不具有相同的
id
。检查DocumentClientException以了解失败原因。如果同时使用唯一密钥,则可能会在某些唯一密钥约束中产生冲突。谢谢,是的,这是导致冲突的单独唯一密钥。我发现文档客户机异常常常会产生误导,因为我发现他们在几个不同的场景中说“id已经存在”,而现在id已经不存在了。