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
相关产品推荐
相关产品推荐

