SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Microsoft AzureのNoSQLデータベース「Cosmos DB」を使ってみよう

Cosmos DBアプリで検索/更新/削除機能を実装する

Microsoft AzureのNoSQLデータベース「Cosmos DB」を使ってみよう 第4回

ドキュメントの削除

 最後にドキュメントの削除について説明します。ドキュメントの削除には通常の即時削除と、時間を指定して削除する方法があります。

即時削除する場合

 ドキュメントを即時削除する場合はデータベース名、コレクション名、ドキュメントのIDを指定してDeleteDocumentAsyncメソッドを呼び出すことで実行できます。

リスト12 DeleteDocumentAsyncメソッド(DocumentRepository.cs)
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]をクリックします。

図3 ドキュメントレベルのTTL有効化設定
図3 ドキュメントレベルのTTL有効化設定

 次に、ドキュメントの有効期間を秒単位で保持するプロパティをドキュメントクラスに追加します。追加する際は、JSONのプロパティ名が「ttl」であることとint型であることが必須の条件となります。

 リスト13では、ドキュメントにTTLを設定しない場合を想定して、プロパティをint?型で定義し、nullだった場合はJSONにこのプロパティを含めないための設定(NullValueHandling)を追加しています。

リスト13 TodoDocumentクラスにTimeToLiveプロパティを追加(TodoDocument.cs)
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から削除されます。

リスト14 ドキュメントにTTLを設定する例
// 3日後にドキュメントを削除する
document.TimeToLive = (int?) TimeSpan.FromDays(3).TotalSeconds;

// ドキュメントは削除ではなく更新する
await DocumentRepository<TodoDocument>.UpsertDocumentAsync(document);

おわりに

 前回と今回を通して、DocumentDB APIを使ったCosmos DBへのデータアクセス方法について説明しました。SDKにはこの他にも、データベースやコレクションのメタデータを取得できるAPIなど、多くの機能が用意されています。

 次回はそれらのAPIも使いながら、実際にCosmos DBを本番環境で運用する上での考慮ポイントやTipsを紹介していきます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Microsoft AzureのNoSQLデータベース「Cosmos DB」を使ってみよう連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 秋葉 龍一(アキバ リュウイチ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10431 2017/10/04 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー