Cosmos SQL Upsert无法按预期工作

时间:2019-03-20 15:01:39

标签: java azure-cosmosdb azure-cosmosdb-sqlapi

我认为增补的重点是替换已经存在的文档。

如果我不创建任何唯一字段,那么它只会插入2个单独的文档。如果我创建一个唯一字段,例如my_timestamp,并且两个请求在该字段中都具有相同的值,那么我将收到DocumentClientException(409冲突-一个ID与文档ID字段匹配的文档已存在)。

我正在upsertDocument Java方法client.upsertDocument(collectionLink, documentDefinition, null, false);中使用false标志随机生成ID。

在哪种情况下upsert会替换文档?我在这里想念什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

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