python - Cosmos Db - 如果不存在则插入
问题描述
亲爱的 Cosmos 会员,
我正在使用 CosmosTrigger 创建 Azure Function (Python):
- 从 source_collection 读取数据
- 将数据写入 target_collection(仅当文档不存在时)
为了实现“如果不存在则插入”功能,我使用唯一键“名称”配置了 target_collection。
例子:
- 写入 target_collection
{"name": "John", "id": "1"}
=> OK - 写入 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。
我的问题:
- 有没有办法忽略引发的错误并使用 func.Out[func.Document].set() 处理整个项目数组?
- 或者,您能否告诉我在 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)
解决方案
解决方案 这就是在 cosmos 中如何插入如果不存在:
- 在您的代码中创建 cosmos 客户端并使用 ExecuteProcedure 将文档从 azure 函数发送到 cosmos 过程
- 将存储过程添加到处理冲突的 cosmos 集合中。您可以从 Microsoft 找到 bulkUpsert_v_2 并对其进行修改,以便在发生冲突 409 时,不会向 cosmos 写入任何内容。
推荐阅读
- ios - 使用 PromiseKit 时如何捕获请求中的错误?
- android - 谷歌服务 json 缺少 client_type 3
- powershell - 将命令输出作为 powershell 咒语运行
- r - 将包含“T07:57:00Z”的字符串更改为日期时间类型?
- mongodb - 如何防止特定收藏不被删除
- r - 如何从一个圆圈的多个角度计算最常见的鸟类飞行方向?
- python - Python - 电子邮件发送在 Raspberry Pi 上显示无效语法
- android - 当我删除一个项目,然后我添加一个新项目时,已删除项目的信息仍然存在
- opencart - 如何在 opencart 3.x 中从我的树枝文件中调用我的自定义函数
- wordpress - 如何在 Woocommerce 的商店页面中显示单个产品 do_action