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

如何在CosmosDB SQL API中实现Azure Table Storage的InsertOrMerge操作

Cosmos DB 模拟Azure Table Storage InsertOrMerge操作方案

核心实现方法

1. 调用原生部分更新API(最优方案)

Cosmos DB SQL API 原生支持部分更新(Patch)能力,无需提前读取完整文档即可实现字段级合并更新,完美匹配ATS的InsertOrMerge效果:

  • 文档已存在时:仅更新你传入的指定字段,其余未指定字段完全保留原有值,不会出现UpsertItemAsync全量替换导致的字段丢失问题
  • 文档不存在时:可搭配条件判断实现原子插入,全程无需读取文档内容

代码示例(C# SDK):

// 仅构造需要更新/插入的字段,不需要传入完整文档
List<PatchOperation> operations = new()
{
    PatchOperation.Set("/字段1", "新值1"),
    PatchOperation.Set("/字段2", "新值2")
};

try
{
    // 尝试执行部分更新
    await container.PatchItemAsync<dynamic>(
        id: "目标文档id",
        partitionKey: new PartitionKey("目标文档分区键"),
        patchOperations: operations);
}
catch (CosmosException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
{
    // 文档不存在时直接插入传入的对象,完成Insert逻辑
    await container.CreateItemAsync(new {
        id = "目标文档id",
        分区键字段 = "目标文档分区键",
        字段1 = "新值1",
        字段2 = "新值2"
    });
}

该方案最多仅需2次接口调用,且不会产生读取文档的开销,成本和性能表现都和原生Upsert接近。

2. 自定义存储过程实现单请求原子操作

如果要求必须单次请求完成原子的InsertOrMerge,可以自定义Cosmos DB存储过程,在服务端实现判断逻辑:

  • 存储过程接收待写入的对象参数,先查询对应id的文档是否存在
  • 不存在则直接插入传入的对象
  • 存在则遍历传入对象的所有字段,覆盖到原有文档后更新写入
    客户端仅需调用一次存储过程即可完成全部逻辑,无需在客户端做任何额外处理。

注意说明

  • 部分更新操作的请求费用和写入同大小的完整文档一致,不会产生额外成本
  • 存储过程仅支持同分区内操作,跨分区场景无法使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:45:06