宇宙数据库----如果不存在则插入

问题描述 投票:0回答:1

亲爱的大同同胞们,

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

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

为了实现 "如果不存在就插入 "的功能,我将target_collection配置为唯一的键 "name"。

例如

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

独有键 "name"。"John "已经存在于target_collection中。所以 outdocs:func.Out[func.Document], outdocs.set()返回冲突 409,"Mary "永远不会被写入 target_collection。

重要的是:当我从数据资源管理器上传包含数组项目的json到target_collection时,所有冲突都会返回错误,但所有项目都得到处理.当我尝试从Azure函数中写入它时,第一个冲突会引发错误,其余项目从未将其写入target_collection。

我的问题是

  1. 有没有一种方法可以忽略引发的错误,并用func.Out[func.Document].set()处理整个数组的项目?
  2. 另外,你能告诉我在大同市实现批量 "不存在时插入 "行为的最佳方法是什么吗?
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)
python azure-functions azure-cosmosdb bulkinsert conflict
1个回答
0
投票

解决方案这就是如何在 cosmos 中插入-if-not-exist 函数。

  1. 在你的代码中创建 cosmos 客户端,并使用 ExecuteProcedure 从 azure 函数向 cosmos 过程发送文档。
  2. 添加存储过程到你的cosmos集合中,处理冲突。你可以从微软找到bulkUpsert_v_2,并修改它,这样当冲突发生409时,没有任何东西会被写入到宇宙中。
© www.soinside.com 2019 - 2024. All rights reserved.