Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

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

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2017/10/04 14:00

 本連載では、Microsoft Azureのサービスラインナップの1つで、NoSQLデータベースのPaaSであるCosmos DBについて「概要」「設計」「実装」「運用」に分けて説明します。4回目の今回は、前回の続きとしてCosmos DBに入ったデータを操作する実装を行います。

目次

対象読者

  • Microsoft Azureや他のクラウドサービスを利用している方
  • NoSQLデータベースを利用している方
  • Cosmos DBの仕組みを理解したい方

検証環境

 本稿では、以下の環境で動作を確認しています。

  • Windows 10 Pro
  • Microsoft Edge 38
  • Microsoft Visual Studio Community 2017
  • .NET Framework 4.7
  • Azure Cosmos DB Emulator最新版

ドキュメントの検索:IDで検索する

 ドキュメントの検索には大きく2通りの方法があります。一つはドキュメントのIDで検索する方法、もう一つがクエリを使った検索です。

 IDで検索する場合は、SDKのReadDocumentByIdAsyncメソッドを使用します。DocumentDB APIではIDによる検索が最も高速で、RU/sを抑えたドキュメントの検索方法です。

 具体例をリスト1に示します。

リスト1 GetDocumentByIdAsyncメソッド(DocumentRepository.cs)
public static async Task<T> GetDocumentByIdAsync(string id)
{
    try
    {
        // IDによるドキュメントの検索
        Document document =
             await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id));

         // Tの型は実行時まで分からないので、dynamicキーワードを使いDocumnet型を動的型付け変数にキャスト
        return (T) (dynamic) document;
    }
    catch (DocumentClientException e)
    {
        if (e.StatusCode == HttpStatusCode.NotFound)
        {
            // Cosmos DBに該当するドキュメントが存在しなかった場合
            Console.WriteLine("ドキュメントが存在しません。");
            return null;
        }
        else
        {
            throw;
        }
    }
}

 前回のドキュメント作成の例では、TodoDocumentクラスにIDのフィールドがなかったため、Cosmos DBによってIDのフィールドに自動でランダムな値が割り当てられましたが、ドキュメントのIDは独自に設定することも可能です。データの特性上、ドキュメントを一意に識別できる項目がある場合はその項目のJSONフィールド名を「id」にすることで独自のIDを割り当てることができます。

 それではTodoDocumentクラスにセッションIDを追加してみます。この時、JsonProperty属性の値を「id」としてください。

リスト2 GetDocumentByIdAsyncメソッド(DocumentRepository.cs)
public class TodoDocument
{
    // セッションID
    [JsonProperty(PropertyName = "id")]
    public string SessionId { get; set; }

    // やること
    [JsonProperty(PropertyName = "todo")]
    public string Todo { get; set; }
        
・・・

 セッションIDを一意にするために、今回は簡易的にGUIDを割り当てていきます。Program.csを修正/メソッド追加していきます。

 Mainメソッドで行っていたドキュメントの作成処理を別メソッドに切り出します。ここでは、自身で作成したセッションID(GUID)を設定してドキュメントを作成します。

リスト3 CreateDocumentAsyncメソッドの追加(Program.cs)
static async Task<string> CreateDocumentAsync()
{
    // セッションID
    var SessionId = Guid.NewGuid().ToString();

    // ドキュメントの作成
    var document = new TodoDocument
    {
        SessionId = SessionId,
        Todo = "Cosmos DBを検索してみる",
        Auther = "yamada",
        CreateDate = DateTime.Now,
        CompleteDate = null,
        IsCompleted = false
    };

    // ドキュメントのCosmos DBへの追加
    await DocumentRepository<TodoDocument>.CreateDocumentAsync(document);

    return SessionId;
}

 検索処理も同様に別メソッド化します。セッションIDを受け取ってドキュメントを検索し、コンソール上に出力します。

リスト4 SearchDocumentByIdメソッドの追加(Program.cs)
static async Task SearchDocumentById(string id)
{
    // IDによるドキュメントの検索
    var document = await DocumentRepository<TodoDocument>.GetDocumentByIdAsync(id);

    // ドキュメントを整形してコンソールに出力する
    Console.WriteLine(JsonConvert.SerializeObject(document, Formatting.Indented));
}

 Mainメソッドはこれらの追加したメソッドを呼び出すように修正します。

リスト5 
 Mainメソッドの修正(Program.cs)
static void Main(string[] args)
{
    // データベース-コレクションの作成(存在しない場合)
    DocumentRepository<TodoDocument>.Initialize();

    // ドキュメントの作成
    var SessionId = CreateDocumentAsync().Result;

    // IDによるドキュメントの検索
    SearchDocumentById(SessionId).Wait();
    
    // キー入力があるまでコンソールを表示する
    Console.ReadKey();
}

 この状態でProgram.csを実行してみると、図1のようにドキュメントがコンソール上に出力されます。Cosmos DB Emulator上にも、同じIDのドキュメントが存在しているはずです。これで、IDによる検索を行うことができました。

図1 IDによるドキュメント検索結果
図1 IDによるドキュメント検索結果

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

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

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2017年5月時点での登録メンバは52名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂き...

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

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:Microsoft AzureのNoSQLデータベース「Cosmos DB」を使ってみよう
All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5