

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

# 查询文档元数据
<a name="working.metadata"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

`INSERT` 语句创建版本号为零的文档的初始修订版。为了唯一标识每个文档，Amazon QLDB 将分配*文档 ID*，以作为元数据的一部分。

除了文档 ID 和版本号外，QLDB 还会将系统为每个文档生成的其他元数据存储至表格。此元数据包含事务信息、日记账属性和文档的哈希值。

系统分配的所有标识符 IDs 都是通用唯一标识符 (UUID)，每个标识符都以 Base62 编码的字符串表示。有关更多信息，请参阅 [IDs 在亚马逊 QLDB 中独树一帜](working.unique-id.md)。

**Topics**
+ [已提交视图](#working.metadata.committed)
+ [加入已提交和用户视图](#working.metadata.committed-joins)

## 已提交视图
<a name="working.metadata.committed"></a>

您可以通过查询*已提交视图*访问文档元数据。此视图从系统定义的表返回文档，该表直接对应于您的用户表。它包括您的数据和系统生成的元数据的最新已提交、未删除修订版。要查询此视图，请在查询中的表名中添加前缀 `_ql_committed_`。（QLDB 中`_ql_`为系统对象保留了前缀。）

```
SELECT * FROM _ql_committed_VehicleRegistration AS r
WHERE r.data.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')
```

使用先前在[创建带有索引的表和插入文档](working.create.md)中插入的数据，此查询的输出显示了每个未删除文档的最新修订版的系统内容。系统文档的 `metadata` 字段中嵌套了元数据，您的用户数据嵌套在`data`字段中。

```
{
    blockAddress:{
        strandId:"JdxjkR9bSYB5jMHWcI464T",
        sequenceNo:14
    },
    hash:{{wCsmM6qD4STxz0WYmE+47nZvWtcCz9D6zNtCiM5GoWg=}},
    data:{
        VIN: "1N4AL11D75C109151",
        LicensePlateNumber: "LEWISR261LL",
        State: "WA",
        City: "Seattle",
        PendingPenaltyTicketAmount: 90.25,
        ValidFromDate: 2017-08-21T,
        ValidToDate: 2020-05-11T,
        Owners: {
            PrimaryOwner: { PersonId: "294jJ3YUoH1IEEm8GSabOs" },
            SecondaryOwners: [{ PersonId: "5Ufgdlnj06gF5CWcOIu64s" }]
        }
    },
    metadata:{
        id:"3Qv67yjXEwB9SjmvkuG6Cp",
        version:0,
        txTime:2019-06-05T20:53:321d-3Z,
        txId:"HgXAkLjAtV0HQ4lNYdzX60"
    }
},
{
    blockAddress:{
        strandId:"JdxjkR9bSYB5jMHWcI464T",
        sequenceNo:14
    },
    hash:{{wPuwH60TtcCvg/23BFp+redRXuCALkbDihkEvCX22Jk=}},
    data:{
        VIN: "KM8SRDHF6EU074761",
        LicensePlateNumber: "CA762X",
        State: "WA",
        City: "Kent",
        PendingPenaltyTicketAmount: 130.75,
        ValidFromDate: 2017-09-14T,
        ValidToDate: 2020-06-25T,
        Owners: {
            PrimaryOwner: { PersonId: "IN7MvYtUjkp1GMZu0F6CG9" },
            SecondaryOwners: []
        }
    },
    metadata:{
        id:"JOzfB3lWqGU727mpPeWyxg",
        version:0,
        txTime:2019-06-05T20:53:321d-3Z,
        txId:"HgXAkLjAtV0HQ4lNYdzX60"
    }
}
```

**已提交视图字段**
+ `blockAddress` — 分类账的日记账中提交文档修订的数据块的位置。可用于加密验证的地址包含以下两个字段。
  + `strandId` — 包含数据块的日记账链的唯一 ID。
  + `sequenceNo` — 一个索引号，用于指定数据块在链中的位置。
**注意**  
本示例中的两个文档都具有相同的`blockAddress`，其`sequenceNo`相同。由于这些文档是在单个事务中插入的（在本例中为单个语句中），因此它们是在同一个数据块内提交的。
+ `hash` — 唯一表示文档修订版本的 SHA-256 Ion 哈希值。哈希值涵盖了修订版 `data` 和 `metadata` 字段，可用于[加密验证](verification.md)。
+ `data` — 文档的用户数据属性。

  如果您对修订版进行编校，则此`data`结构将替换为`dataHash`字段，该字段的值是已删除`data`结构的 Ion 哈希。
+ `metadata` — 文档的元数据属性。
  + `id` — 系统为文档分配的唯一 ID。
  + `version` — 文档的版本号。这是从零开始的整数，随着每个文档修订版本的增加而递增。
  + `txTime` – 文档修订提交到日记账的时间戳。
  + `txId` – 提交文档修订的事务唯一 ID。

## 加入已提交和用户视图
<a name="working.metadata.committed-joins"></a>

您可编写将已提交视图中的表与用户视图中的表连接起来的查询。例如，您可能希望将一个表`id`文档与另一个表的用户定义字段连接起来。

以下查询分别将两个名为 `DriversLicense` 和 `Person`的表与其 `PersonId`和的文档 `id`字段连接起来，后者使用已提交的视图。

```
SELECT * FROM DriversLicense AS d INNER JOIN _ql_committed_Person AS p
ON d.PersonId = p.metadata.id
WHERE p.metadata.id = '1CWScY2qHYI9G88C2SjvtH'
```

要了解如何在默认用户视图中查询文档 ID 字段，请继续 [通过 BY 子句查询文档 ID](working.metadata.by-clause.md)。