

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 PATCH 操作修改资源
<a name="managing-fhir-resources-patch"></a>

AWS HealthLake 支持 FHIR 资源的 PATCH 操作，使您能够通过将特定元素定位为添加、替换或删除来修改资源，而无需更新整个资源。当您需要执行以下操作时，此操作特别有用：
+ 对大型资源进行有针对性的更新
+ 减少网络带宽使用量
+ 对特定资源元素进行原子修改
+ 最大限度地降低覆盖并发更改的风险
+ 作为批处理和事务工作流程的一部分更新资源

## 支持的补丁格式
<a name="patch-supported-formats"></a>

AWS HealthLake 支持两种标准补丁格式：

### JSON 补丁 (RFC 6902)
<a name="patch-format-json"></a>

使用 JSON 指针语法按元素在资源结构中的位置来定位元素。

**Content-Type:** `application/json-patch+json`

### FHIRPath 补丁（FHIR R4 规范）
<a name="patch-format-fhirpath"></a>

使用 FHIRPath 表达式根据元素的内容和关系来定位元素，从而提供了 FHIR 原生的修补方法。

**Content-Type:** `application/fhir+json`

## 用法
<a name="patch-usage"></a>

### 直接补丁操作
<a name="patch-usage-direct"></a>

可以使用 PATCH HTTP 方法直接在 FHIR 资源上调用 PATCH 操作：

```
PATCH [base]/[resource-type]/[id]{?_format=[mime-type]}
```

### 捆绑包中的补丁
<a name="patch-usage-bundles"></a>

补丁操作可以作为类型为 FHIR Bundle 的条目包含在内`transaction`，`batch`也可以在单个请求中将补丁操作与其他 FHIR 交互（创建、读取、更新、删除）结合起来。
+ **交易捆绑包**：所有条目都以原子方式成功或失败
+ **Batch 捆绑包**：每个参赛作品均独立处理

## JSON 补丁格式
<a name="patch-json-format"></a>

### 支持的操作
<a name="patch-json-supported-operations"></a>


| 操作 | 说明 | 
| --- | --- | 
| add | 为资源添加新值 | 
| remove | 从资源中移除一个值 | 
| replace | 替换资源中的现有值 | 
| move | 从一个位置移除一个值并将其添加到另一个位置 | 
| copy | 将值从一个位置复制到另一个位置 | 
| test | 测试目标位置的值是否等于指定值 | 

### 路径语法
<a name="patch-json-path-syntax"></a>

JSON 补丁使用 JSON 指针语法 (RFC 6901)：


| 路径示例 | 说明 | 
| --- | --- | 
| /name/0/family | 名字的家族元素 | 
| /telecom/- | 追加到电信阵列 | 
| /active | 根级活动元素 | 
| /address/0/line/1 | 第一个地址的第二行 | 

### 示例
<a name="patch-json-examples"></a>

**包含多个操作的直接 JSON 补丁请求**  


```
PATCH [base]/Patient/example
Content-Type: application/json-patch+json
If-Match: W/"1"

[
  {
    "op": "replace",
    "path": "/name/0/family",
    "value": "Smith"
  },
  {
    "op": "add",
    "path": "/telecom/-",
    "value": {
      "system": "phone",
      "value": "555-555-5555",
      "use": "home"
    }
  },
  {
    "op": "remove",
    "path": "/address/0"
  },
  {
    "op": "move",
    "from": "/name/0/family",
    "path": "/name/1/family"
  },
  {
    "op": "test",
    "path": "/gender",
    "value": "male"
  },
  {
    "op": "copy",
    "from": "/name/0",
    "path": "/name/1"
  }
]
```

**通过单一操作直接请求 JSON 补丁**  


```
PATCH [base]/Patient/example
Content-Type: application/json-patch+json

[
  {
    "op": "replace",
    "path": "/active",
    "value": false
  }
]
```

**套装中的 JSON 补丁**  
使用包含 base64 编码的 JSON 补丁负载的二进制资源：

```
{
  "resourceType": "Bundle",
  "type": "transaction",
  "entry": [{
    "resource": {
      "resourceType": "Binary",
      "contentType": "application/json-patch+json",
      "data": "W3sib3AiOiJhZGQiLCJwYXRoIjoiL2JpcnRoRGF0ZSIsInZhbHVlIjoiMTk5MC0wMS0wMSJ9XQ=="
    },
    "request": {
      "method": "PATCH",
      "url": "Patient/123"
    }
  }]
}
```

## FHIRPath 补丁格式
<a name="patch-fhirpath-format"></a>

### 支持的操作
<a name="patch-fhirpath-supported-operations"></a>


| 操作 | 说明 | 
| --- | --- | 
| add | 向资源添加新元素 | 
| insert | 在列表的特定位置插入一个元素 | 
| delete | 从资源中移除元素 | 
| replace | 替换现有元素的值 | 
| move | 对列表中的元素重新排序 | 

### 路径语法
<a name="patch-fhirpath-path-syntax"></a>

FHIRPath 补丁使用 FHIRPath 表达式，支持：
+ **基于索引的访问**：`Patient.name[0]`
+ 使用以下@@ **方式进行筛选 `where()`**：`Patient.name.where(use = 'official')`
+ **布尔逻辑**：`Patient.telecom.where(system = 'phone' and use = 'work')`
+ **子集设置函数**：`first()`，`last()`
+ **存在性检查**：`exists()`，`count()`
+ **多态导航**：`Observation.value`

### 示例
<a name="patch-fhirpath-examples"></a>

**直接申请 FHIRPath 补丁**  


```
PATCH [base]/Patient/123
Content-Type: application/fhir+json
Authorization: ...

{
  "resourceType": "Parameters",
  "parameter": [{
    "name": "operation",
    "part": [
      { "name": "type", "valueCode": "add" },
      { "name": "path", "valueString": "Patient" },
      { "name": "name", "valueString": "birthDate" },
      { "name": "value", "valueDate": "1990-01-01" }
    ]
  }]
}
```

**FHIRPath 捆绑包中的补丁**  
使用带有`method: PATCH`以下内容的参数资源作为入口资源：

```
{
  "resourceType": "Bundle",
  "type": "transaction",
  "entry": [{
    "resource": {
      "resourceType": "Parameters",
      "parameter": [{
        "name": "operation",
        "part": [
          { "name": "type", "valueCode": "add" },
          { "name": "path", "valueString": "Patient" },
          { "name": "name", "valueString": "birthDate" },
          { "name": "value", "valueDate": "1990-01-01" }
        ]
      }]
    },
    "request": {
      "method": "PATCH",
      "url": "Patient/123"
    }
  }]
}
```

## 请求标头
<a name="patch-request-headers"></a>


| 标题 | 必需 | 描述 | 
| --- | --- | --- | 
| Content-Type | 是 | application/json-patch\$1json用于 JSON 补丁或application/fhir\$1json FHIRPath 补丁 | 
| If-Match | 否 | 使用特定版本的条件更新 ETag | 

## 示例响应
<a name="patch-sample-response"></a>

该操作将返回包含新版本信息的更新资源：

```
HTTP/1.1 200 OK
Content-Type: application/fhir+json
ETag: W/"2"
Last-Modified: Mon, 05 May 2025 10:10:10 GMT

{
  "resourceType": "Patient",
  "id": "example",
  "active": true,
  "name": [
    {
      "family": "Smith",
      "given": ["John"]
    }
  ],
  "telecom": [
    {
      "system": "phone",
      "value": "555-555-5555",
      "use": "home"
    }
  ],
  "meta": {
    "versionId": "2",
    "lastUpdated": "2025-05-05T10:10:10Z"
  }
}
```

## 行为
<a name="patch-behavior"></a>

补丁操作：
+ 根据相应的规范验证补丁语法（JSON 补丁为 RFC 6902，补丁为 FHIR R4） FHIRPath 
+ 以原子方式应用操作-所有操作成功或全部失败
+ 更新资源版本 ID 并创建新的历史记录条目
+ 在应用更改之前，将原始资源保留在历史记录中
+ 在应用补丁后验证 FHIR 资源限制
+ 支持使用带有 If-Match 标头的条件更新 ETag

## 错误处理
<a name="patch-error-handling"></a>

该操作处理以下错误情况：
+ **400 错误请求**：补丁语法无效（请求不符合要求或补丁文档格式错误）
+ **404 未找到**：未找到资源（指定的 ID 不存在）
+ **409 冲突**：版本冲突（并发更新或提供了非当前版本 ID）
+ **422 无法处理的实体**：补丁操作无法应用于指定的资源元素

## 功能摘要
<a name="patch-summary-of-capabilities"></a>


| 能力 | json 补丁 | FHIRPath 补丁 | 
| --- | --- | --- | 
| 内容类型 | application/json-patch\$1json | application/fhir\$1json | 
| 路径格式 | JSON Pointer (RFC 6901) | FHIRPath 表达式 | 
| 直接补丁 API | 支持 | 支持 | 
| 捆绑包 Batch | 支持（通过二进制） | 支持（通过参数） | 
| 捆绑交易 | 支持（通过二进制） | 支持（通过参数） | 
| 操作 | 添加、删除、替换、移动、复制、测试 | 添加、插入、删除、替换、移动 | 

## 限制
<a name="patch-limitations"></a>
+ 不支持使用搜索条件的条件补丁操作
+ 捆绑包中的 JSON 补丁必须使用带有 base64 编码内容的二进制资源
+ FHIRPath 捆绑包中的补丁必须使用参数资源

## 其他资源
<a name="patch-additional-resources"></a>

有关 PATCH 操作的更多信息，请参阅：
+ [FHIR R4 补丁文档](https://hl7.org/fhir/http.html#patch)
+ [FHIR R4 补丁规范 FHIRPath ](https://hl7.org/fhir/fhirpatch.html)
+ [RFC 6902-JSON 补丁](https://datatracker.ietf.org/doc/html/rfc6902#section-4)
+ [RFC 6901-JSON Pointer](https://datatracker.ietf.org/doc/html/rfc6901)