ドキュメントの削除
最後にドキュメントの削除について説明します。ドキュメントの削除には通常の即時削除と、時間を指定して削除する方法があります。
即時削除する場合
ドキュメントを即時削除する場合はデータベース名、コレクション名、ドキュメントのIDを指定してDeleteDocumentAsyncメソッドを呼び出すことで実行できます。
public static async Task DeleteDocumentAsync(string documentId)
{
// 削除するドキュメントのリンクを作る
var documentLink = UriFactory.CreateDocumentUri(DatabaseId, CollectionId, documentId);
// ドキュメントを削除する
await client.DeleteDocumentAsync(documentLink);
}
有効期間を設定して削除する場合
Cosmos DBのTTL(Time to Live)の機能を使うことで、指定した時間を経過した時点でドキュメントを削除するようにコントロールすることができます。TTLはコレクション単位とドキュメント単位で設定することができますが、今回はドキュメント単位で設定する手順を説明します。
まずはEmulatorのExplorer画面で、コレクションのメニューにある[Scale & Settings]からTime to Liveの設定を[On (no default)]に変更し、[Save]をクリックします。
次に、ドキュメントの有効期間を秒単位で保持するプロパティをドキュメントクラスに追加します。追加する際は、JSONのプロパティ名が「ttl」であることとint型であることが必須の条件となります。
リスト13では、ドキュメントにTTLを設定しない場合を想定して、プロパティをint?型で定義し、nullだった場合はJSONにこのプロパティを含めないための設定(NullValueHandling)を追加しています。
class TodoDocument
{
// ドキュメントの有効期間(秒)
[JsonProperty(PropertyName= "ttl", NullValueHandling = NullValueHandling.Ignore)]
public int? TimeToLive { get; set; }
// セッションID
[JsonProperty(PropertyName = "id")]
public string SessionId { get; set; }
---
ここまで設定ができたら、ドキュメントを扱うコード上でTTL用のプロパティに削除までの有効期間を秒単位で設定します。TimeSpan構造体のメソッドを使うことで日や時間から秒への変換を容易にすることができるでしょう。
最後に、ドキュメントはUpsertDocumentAsyncなどのAPIを使いCosmos DBに追加/更新して保存します。保存された時点からTTLに設定した時間でカウントダウンが始まり、0になった時点でドキュメントがCosmos DBから削除されます。
// 3日後にドキュメントを削除する document.TimeToLive = (int?) TimeSpan.FromDays(3).TotalSeconds; // ドキュメントは削除ではなく更新する await DocumentRepository<TodoDocument>.UpsertDocumentAsync(document);
おわりに
前回と今回を通して、DocumentDB APIを使ったCosmos DBへのデータアクセス方法について説明しました。SDKにはこの他にも、データベースやコレクションのメタデータを取得できるAPIなど、多くの機能が用意されています。
次回はそれらのAPIも使いながら、実際にCosmos DBを本番環境で運用する上での考慮ポイントやTipsを紹介していきます。
