最新バージョンの Azure Cosmos DB ドキュメントを取得する

この記事では、取り込み済みのドキュメントの最新バージョンを取得する方法について説明します。

最新バージョンのドキュメントを取得する

ドキュメントの更新が変更フィードから取り込まれるたびに、ターゲット テーブルに新しい行が追加されます。 このテーブルに、時間の経過とともに、対応する Cosmos DB コンテナー内のすべてのドキュメントの履歴が積み上がります。 一般的な要件は、最新バージョンのドキュメントに対してクエリを実行することです。これは、Cosmos DB コンテナーの現在の状態の取得に対応します。

次の方法を使用して、テーブルから現在の状態クエリを実行できます。

この例では、Id 列でテーブルを要約し、_timestamp 列に arg_max 関数を使用して、最新のタイムスタンプを持つ行のみを表示することで、ドキュメントの最新バージョンを取得します。

Note

_timestamp 列は、取り込まれた Cosmos DB ドキュメントの _ts プロパティから作成されます。 DateTimeFromUnixSeconds (_ts) から datetime (_timestamp) への変換は、このテーブル用に構成されたインジェスト テーブル マッピングによって実行されます。 _timestamp 列の変換されたデータは、ネイティブの DateTimeFromUnixSeconds _ts 値を使用するよりも、クエリと具体化されたビューを効率的にします。

クエリを実行して最新バージョンのドキュメントを取得する

次のクエリを実行して、最新バージョンのドキュメントを取得します。

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