Cosmos Db-如果不存在则插入

时间:2020-05-15 10:51:43

标签: python azure-functions azure-cosmosdb bulkinsert conflict

尊敬的宇宙同伴,

我正在使用CosmosTrigger创建Azure函数(Python),

  • 从source_collection读取数据
  • 将数据写入target_collection(仅当文档不存在时)

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

示例:

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

唯一键“名称”:“ John”已存在于target_collection中。因此outdocs:func.Out [func.Document],outdocs.set()返回冲突409,并且“ Mary”从未写入target_collection。

重要提示:当我将带有项目数组的json从Data Explorer上传到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)

1 个答案:

答案 0 :(得分:0)

解决方案 这是在宇宙中完成不存在插入的方式:

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