首页 > 解决方案 > Cosmos Db - 如果不存在则插入

问题描述

亲爱的 Cosmos 会员,

我正在使用 CosmosTrigger 创建 Azure Function (Python):

为了实现“如果不存在则插入”功能,我使用唯一键“名称”配置了 target_collection。

例子:

  1. 写入 target_collection {"name": "John", "id": "1"}=> OK
  2. 写入 target_collection [{"name": "John", "id": "2"}, {"name": "Mary", "id": "3"}]=> System.Private.CoreLib:执行函数时出现异常:Functions.CosmosTrigger。Microsoft.Azure.DocumentDB.Core:系统中已存在具有指定 ID 的实体。

唯一键“name”:target_collection 中已存在“John”。所以 outdocs:func.Out[func.Document],outdocs.set() 返回冲突 409 并且“Mary”永远不会被写入 target_collection。

重要提示:当我将带有项目数组的 json 从数据资源管理器上传到 target_collection 时,所有冲突都会返回错误,但所有项目都会得到处理。当我尝试从 Azure 函数编写它时,第一次冲突会引发错误,并且剩余的项目永远不会进入 target_collection。

我的问题:

  1. 有没有办法忽略引发的错误并使用 func.Out[func.Document].set() 处理整个项目数组?
  2. 或者,您能否告诉我在 Cosmos 中实现批量“如果不存在则插入”行为的最佳方法是什么?
def main(docs: func.DocumentList, outdocs: func.Out[func.Document]) -> str:
  compl_docs = func.DocumentList()

    compl_docs_dict = {
      "name": "John",
      "id": "2"
    }

    compl_docs.append(func.Document.from_dict(compl_docs_dict))

    compl_docs_dict = {
      "name": "Mary",
      "id": "3"
    }

    compl_docs.append(func.Document.from_dict(compl_docs_dict))

  outdocs.set(compl_docs)

标签: pythonazure-functionsazure-cosmosdbbulkinsertconflict

解决方案


解决方案 这就是在 cosmos 中如何插入如果不存在:

  1. 在您的代码中创建 cosmos 客户端并使用 ExecuteProcedure 将文档从 azure 函数发送到 cosmos 过程
  2. 将存储过程添加到处理冲突的 cosmos 集合中。您可以从 Microsoft 找到 bulkUpsert_v_2 并对其进行修改,以便在发生冲突 409 时,不会向 cosmos 写入任何内容。

推荐阅读