【问题标题】:CosmosDB SQL API Insert or MergeCosmosDB SQL API 插入或合并
【发布时间】:2021-12-11 01:22:40
【问题描述】:

我们决定在某些情况下从 Azure 表存储 (ATS) 迁移到 CosmosDB。我想弄清楚,如何在 CosmosDB SQL API 中模仿 ATS InsertOrMerge 操作。使用 UpsertItemAsync 实际上会替换项目(如果找到)。

为了说明问题,让我们假设 app1 在 CosmosDB 中创建了一个包含 3 个非空字段的项。 app2 想要更新项目,但有 2 个非空字段的项目(例如,其中一个是 id 以匹配上一条记录)。来自 ATS 的 InsertOrMerge 将产生 2 个新的非空字段,其余字段将来自 app1 项目(非空)字段。来自 Cosmos 的 UpsertItemAsync 将简单地替换该项目(丢失第三个字段)。

当然,这可以通过首先获取项目、将其与新对象合并并替换新项目来完成,但这意味着需要再调用一次。有没有办法在不首先检索项目的情况下做到这一点?

【问题讨论】:

    标签: azure-cosmosdb upsert


    【解决方案1】:

    Cosmos DB 中有一个 Partial Document Update 功能,但目前处于私人预览阶段(在回答此问题时)。

    您可以详细了解此功能以及如何启用您的帐户以使用此功能,请参阅此链接:https://github.com/AzureCosmosDB/PatchPrivatePreviewFeedbackGroup。

    【讨论】:

    • 感谢您的回答。这正是我一直在寻找的。你知道它什么时候会成为稳定包的一部分(而不是预览模式)吗?或者,是否有可能根本不会发布此功能(希望不会)?不确定我们是否可以在生产应用程序中依赖它..
    • 我会让 Cosmos DB 的人回答这个问题。
    • 这里的任何人都无法回答这个问题,即使是 Cosmos DB 团队的人 - 这是一个路线图/规划问题。
    【解决方案2】:

    我将此添加为指定方法和示例的另一个答案。

    正如@Gaurav 所提到的,您可以在此处将Partial Document Update Patch API 功能与Cosmosdb 结合使用。您正在寻找的是 Replace 方法

    cosmosPatchOperations.replace("/taskNum", newTaskNum);
    

    您也可以使用条件补丁操作命令来替换属性。

    【讨论】:

    • 你好。我可以看到您还在 MS Q&A 中回答了我的问题。也许跟进问题,我通过您提供的链接中的表格注册,但是,我还没有收到确认。这可能是我在尝试执行补丁操作时收到 400 - bad request(没有任何理由)的原因吗?
    • 是的,正确,您能否提供您的订阅 ID 以在内部检查此功能是否已激活。您还可以通过运行 /EnablePatchPreview 使用模拟器测试 Patch API
    猜你喜欢
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多