You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CosmosDB中Upsert操作匹配ID还是同时匹配ID与分区键?

CosmosDB SQL API Upsert操作匹配规则问题

背景信息

我使用SQL API的Cosmos数据库,现有文档如下:

{
    "id": "123",
    "city": "myCity",
    "address": "myAddress"
}

其中id作为文档ID,city作为分区键。

假设执行Upsert操作,传入以下对象作为负载,并指定分区键值为"myCity",会插入新文档还是更新已有文档?

{
    "id": "123",
    "city": "anotherCity",
    "address": "myAddress"
}

.NET中的Upsert示例代码:

await myRepository.UpsertItemAsync(myObject, "myCity");

问题

CosmosDB容器中的Upsert操作执行更新时,仅需匹配ID,还是需同时匹配ID与分区键?


回答

CosmosDB的Upsert操作执行更新时,必须同时匹配ID和分区键。

具体逻辑如下:

  • 分区键是CosmosDB定位逻辑分区的核心依据,Upsert会先根据你指定的分区键值找到对应的逻辑分区;
  • 在同一个逻辑分区内部,id是文档的唯一标识,只有当该分区内存在与传入id完全匹配的文档时,才会执行更新操作;如果不存在,则插入新文档。

针对你的场景:
你显式指定了分区键值为"myCity",此时CosmosDB会定位到"myCity"对应的逻辑分区,该分区内已有id为"123"的文档,所以这个Upsert操作会更新该分区内的已有文档,更新后文档的city字段会被替换为"anotherCity"。

如果你的Upsert操作指定的分区键值是"anotherCity",那么会在"anotherCity"这个全新的逻辑分区中插入一条id为"123"的新文档——因为该分区内没有相同id的文档,满足插入条件。

内容的提问来源于stack exchange,提问作者wenzzzel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:05:34