SHOEISHA iD

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

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

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

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

対象読者

  • 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によるドキュメント検索結果

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
ドキュメントの検索:クエリを使って検索する

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
Microsoft AzureのNoSQLデータベース「Cosmos DB」を使ってみよう連載記事一覧

もっと読む

この記事の著者

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10431 2017/10/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング