获取最新版本的 Azure Cosmos DB 文档

本文介绍如何获取所引入文档的最新版本。

获取最新版本的文档

每次从更改源中引入文档更新时,都会在目标表中添加一个新行。 随着时间的推移,该表会在相应的 Cosmos DB 容器中建立每个文档的历史记录。 一个典型的要求是查询文档的最新版本,对应于获取 Cosmos DB 容器的当前状态。

可以使用以下方式从表中查询当前状态:

在示例中,你将通过按 Id 列汇总表来获取文档的最新版本,在_timestamp 列上使用 arg_max 函数来仅显示具有最新时间戳的行。

备注

_timestamp 列是基于引入的 Cosmos DB 文档的_ts 属性创建的。 从 DateTimeFromUnixSeconds (_ts) 到 datetime (_timestamp) 的转换是由为表配置的引入表映射执行的。 与使用原生的 DateTimeFromUnixSeconds_ts 值相比,_timestamp 列中的转换后数据可以提高查询和具体化视图的性能。

运行查询以获取最新版本的文档

运行以下查询以获取最新版本的文档:

TestTable
| summarize arg_max(_timestamp, *) by Id

如果使用了软标记来标记已删除的文档,则可使用以下查询将其筛选掉:

TestTable
| summarize arg_max(_timestamp, *) by Id
| where not(IsDeleted)

创建最新版本文档的具体化视图

如果 Cosmos DB 容器有很多更新,获取最新版本文档的查询可能会很慢。 如果有大量更新,具体化视图通常比查询具有更好的性能。 如果查询频繁运行,使用具体化视图可能会很有用,可以节省成本。

运行以下命令以创建最新版本文档的具体化视图:

.create materialized-view LatestDocuments on table TestTable
{
    CosmosChangeFeed1
    | summarize arg_max(_timestamp, *) by Id
}

在具体化视图中,你不能将我们的软标记作为其查询的一部分进行筛选。 因此,若要移除软标记指示的已删除文档,请查询具体化视图并筛选结果,如下所示:

LatestDocuments
| where not(IsDeleted)

可以选择将筛选后的查询封装在存储函数中并调用它以获取最新的筛选结果,如下所示:

.create function LatestDocumentsDeletedRemoved(){
    LatestDocuments
    | where not(IsDeleted)
}

LatestDocumentsDeletedRemoved
| summarize sum(Salary) by Area