你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
该$bulk-update操作允许您使用异步处理进行批量更新多个 FHIR 资源。 它支持:
- 所有资源类型的系统级更新
- 限定于特定资源类型的更新
- 单个请求中的多资源操作
注释
请谨慎使用 $bulk-update 的操作。 已更新的资源在提交后无法回滚。 建议首先使用与批量更新作业相同的参数运行 FHIR 搜索,以验证要更新的数据。
该$bulk-update操作使用下面列出的受支持的补丁类型来执行更新。
- replace:替换现有值。 它利用 FHIR Patch 的“替换”语义,确保更新保持幂等性
- upsert:如果值不存在,则添加一个值;如果值已存在,则替换该值。
注释
不支持其他修补操作(例如:添加、移动、删除、插入)。
批量更新操作的必要先决条件
必需的角色
若要执行批量更新,必须为应用程序或用户分配以下角色之一:
- FHIR 数据批量操作符:提供对 FHIR 服务中的批量操作的访问权限。
- FHIR 数据参与者:对 FHIR 服务的管理访问权限。
所需标头
| Header | 价值 |
|---|---|
| Accept | application/fhir+json |
| 偏好 | 异步响应 |
请求
可以在请求中使用 FHIR 搜索参数。 批量更新操作支持标准搜索筛选器,例如:address:contains=Meadow 或 Patient.birthdate=1987-02-20。 还可以使用_include、_revinclude和_not-referenced来扩展搜索条件。
请求示例
- 系统级批量更新:在系统级别执行操作,使能对 FHIR 服务器上所有的资源类型中的 FHIR 资源进行更新。
PATCH https://{FHIR-SERVICE-HOST}/$bulk-update
- 范围限为单个资源类型的更新:如果对单个资源类型执行此操作,可更新映射到 URL 中的资源类型的 FHIR 资源。
PATCH https://{FHIR-SERVICE-HOST}/[ResourceType]/$bulk-update
- 根据搜索参数查询待更新的资源。 在此示例中,我们将使用
_include并_revinclude更新 2021-12-18 之前更新的所有患者资源,以及引用这些资源的所有资源:
PATCH {FHIR-SERVICE-HOST}/Patient/$bulk-update?_lastUpdated=lt2021-12-18&_revinclude=*
PATCH {FHIR-SERVICE-HOST}/DiagnosticReport/$bulk-update?_lastUpdated=lt2021-12-12&_include=DiagnosticReport:based-on:ServiceRequest&_include:iterate=ServiceRequest:encounter
在对 FHIR 搜索参数使用批量更新时,请考虑先在 FHIR 搜索中使用同一查询,以便可以验证计划更新的数据。
下面是一个示例请求正文。
{
"resourceType": "Parameters",
"parameter": [
{
"name": "operation",
"part": [
{
"name": "type",
"valueCode": "upsert"
},
{
"name": "path",
"valueString": "Resource.meta"
},
{
"name": "name",
"valueString": "security"
},
{
"name": "value",
"valueCoding": {
"system": "http://example.org/security-system",
"code": "SECURITY_TAG_CODE",
"display": "Updated Security Tag Display"
}
}
]
}
]
}
要点
- 每个补丁路径必须以
ResourceType根(例如Patient.meta.tag)开头,以明确区分元级别更新和元素更新。 可以使用资源根来修补通用属性。 可以在系统级别、单个资源类型或多个资源类型执行批量更新。 如果需要更新不同资源类型的不同字段,可以在单独的操作中指定字段与值的映射。 - 如果搜索返回多个资源类型,则修补程序仅应用于其类型与修补路径中的前缀匹配
ResourceType的资源;将忽略其他类型。 -
SearchParameter并StructureDefinition被视为批量更新的作用域外。 如果按资源类型在SearchParameter或StructureDefinition上运行批量更新作业,也会导致“400 错误请求”错误。 如果系统或资源类型级别的批量更新查询返回类型SearchParameter或StructureDefinition的资源,在操作期间将忽略这些资源。 只会更新其他资源类型。
响应
提交批量更新操作时,将返回以下格式的响应,其中Content-Location标头指向轮询终结点。
Content-Location: https://{hostname}/_operations/bulk-update/{job-id}
轮询终结点结果
根据批量更新作业的状态,对轮询终结点的请求将导致 4 个结果中的一个。 结果在 FHIR 响应的 OperationOutcome 中提供。
| 状态 | Description |
|---|---|
| 202 | 正在进行的作业 |
| 200 | 用户已完成或取消的作业 |
| Other | 基于错误类型的失败状态 |
对批量更新作的响应包括四个关键组件:
- ResourceUpdatedCount:显示已成功更新的资源数,按资源类型分组。
-
ResourceIgnoredCount:按资源类型指示批量更新期间忽略的资源数。 如果没有相应类型的 Patch 请求,或者它们属于被排除的类型(例如
SearchParameter或StructureDefinition),则忽略这些资源。 - ResourcePatchFailedCount:按资源类型显示修补作失败的资源数。 例如,如果尝试替换不存在的值,则修补程序将失败并计算在此处。 如果某些资源失败,但其他资源失败,则作业被视为“软失败”。 “问题”部分中提供了一条通用消息,建议对单个资源使用 FHIR PATCH 操作以获取详细的错误信息。
- 问题:提供有关任何作业失败或失败更新原因的详细信息。
下面是一个示例响应体。
{
"resourceType": "Parameters",
"parameter": [
{
"name": "ResourceUpdatedCount",
"part": [
{ "name": "Practitioner", "valueInteger64": 10 },
{ "name": "Specimen", "valueInteger64": 7 },
{ "name": "Device", "valueInteger64": 3 }
]
},
{
"name": "ResourceIgnoredCount",
"part": [
{ "name": "StructureDefinition", "valueInteger64": 9 },
{ "name": "SearchParameter", "valueInteger64": 8 }
]
}
]
}
响应错误处理
| HTTP 状态 | 原因 | Action |
|---|---|---|
| 400 | 已在运行中的作业、不受支持的操作类型或已排除的资源类型。 一次只能运行一个批量更新作业。 如果在一个作业进行时尝试启动另一个作业,将导致“400 错误请求”错误。 | 解决冲突后重试。 |
| 403 | 未经 授权 | 分配所需的角色。 |
| 429 | 已中止 | 使用减少负载重试。 |
| 500 | 服务器错误 | 创建支持票证。 |
| 503 | 数据库问题 | 请稍后重试。 |
取消批量更新作业
将 DELETE 请求发送到作业的轮询终结点,如下所示。
DELETE https://{FHIR-SERVICE-HOST}/_operations/bulk-update/{job-id}
注释
取消作业后,若重试则会上次中断的位置继续执行删除流程。
审核日志
可以从 MicrosoftHealthcareApisAuditLogs 查询审核日志:
- 依据
ResourceId筛选。 - 在记录中查找:作业已启动、作业已成功和补丁失败。
FAQ
为什么更新的资源计数与预期不匹配?
- 更少:在运行此作业之前,资源可能已被另一个作业修改。
- 更多:启动批量更新后,新的导入作业可能已插入资源。
如果批量更新作业似乎停滞不前,如何解决这个问题的步骤有哪些? 若要检查批量更新作业是否停滞,请使用与批量更新作业相同的参数运行 FHIR 搜索,在查询中添加适当的操作条件,并包括_summary=count。 如果资源计数下降,则表明作业正在进行。 还可以取消批量更新作业,然后重试。
批量更新作业并发执行时,对 REST API 调用有什么影响? 运行批量更新作时,可能会看到对服务的并发调用延迟增加。 为了避免延迟增加,建议取消批量更新作业,然后在流量较低的时间段内重新运行它。
是否可还原更改? 应仔细使用批量更新功能。 例如,如果启用了版本控制,请提取历史版本,并使用 PUT 还原它们,或从备份还原(数据保留 7-30 天,具体取决于配置)。
什么是 ResourcePatchFailedCount?
这是在 PATCH 操作期间失败的资源计数。 原因可能包括:
- 替换不存在的元素
- 尝试更新不可变字段
检查审核日志或单独提交 PATCH 请求以获取错误详细信息。
后续步骤
- 详细了解 FHIR 路径修补程序
- 浏览 Azure Health Data Services FHIR 文档
- 管理角色和访问权限