SHOEISHA iD

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

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

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

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

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

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

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

 Cosmos DBは、デフォルトでドキュメント内の全てのフィールドにインデックスを付与します。そのため、ID以外のフィールドであっても高速に検索することが可能となっています。

 ID以外の項目の場合、クエリを使うことで検索条件として利用することができます。以下のGetDocumentByQueryAsyncメソッドでは、検索条件(predicate)を引数として受け取るようにしています。

リスト6 GetDocumentByQueryAsyncメソッド(DocumentRepository.cs)
public static T GetDocumentByQuery(Expression<Func<T, bool>> predicate)
{
    return client.CreateDocumentQuery<T>(UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId))
                .Where(predicate)
                .AsEnumerable()
                .FirstOrDefault();
}

 メソッドの呼び出し側で検索条件を組み立てます。例えば、作成者で検索したい場合はリスト7の書き方です。

リスト7 GetDocumentByQueryAsyncメソッド(Program.cs)
static TodoDocument SearchDocumentByQuery()
{
    // 作成者を指定したドキュメントの検索
    var document = DocumentRepository<TodoDocument>.GetDocumentByQuery(
        (doc) => doc.Auther.Equals("yamada")
    );

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

    return document;
}

 MainメソッドからGetDocumentByQueryAsyncメソッドを呼び出すように修正し、Program.csを実行します(なお、ドキュメントの作成とIDによる検索は一時的にコメントアウトしています)。

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

    // IDによるドキュメントの検索
    // SearchDocumentById(SessionId).Wait();

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

 すると、作成者(auther)が「yamada」のドキュメントだけが取得できるようになりました。このクエリを使った検索結果は、以下のSQLで検索をした場合と等価になります。

SELECT * FROM c WHERE c.auther = 'yamada';

ドキュメントの更新

 続いてはドキュメントの更新を行ってみましょう。

 Cosmos DBにはドキュメントのアップサートをするためのUpsertDocumentAsyncメソッドが用意されているので、それを使います。アップサートは、ドキュメントが既にCosmos DBに存在すれば更新(アップデート)を、存在しなければ追加(インサート)を行うAPIです。

 ドキュメント追加用のAPIとしては、前回紹介したCreateDocumentAsyncメソッドがありますが、既に存在するドキュメントをもう一度追加しようとするとエラーとなります。UpsertDocumentAsyncメソッドはエラーとならないため、利便性の面で優れています。ただし、本来更新するべきではないドキュメントを誤って更新してしまうといったケースも発生しかねないため、用途に応じてUpsertDocumentAsyncとCreateDocumentAsyncを使い分けることが大切です。

リスト9 UpsertDocumentAsyncメソッド(DocumentRepository.cs)
public static async Task UpsertDocumentAsync(T document)
{
    await client.UpsertDocumentAsync(
        UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
        document);
}

 Program.csにUpdateDocumentメソッドを追加し、Mainメソッドから呼び出すように修正します。

リスト10 UpdateDocumentメソッド(Program.cs)
static async Task<TodoDocument> UpdateDocument(TodoDocument document)
{
    document.IsCompleted = true;
    document.CompleteDate = DateTime.Now;

    await DocumentRepository<TodoDocument>.UpsertDocumentAsync(document);

    return document;
}
リスト11 Mainメソッドの修正(Program.cs)
static void Main(string[] args)
{
    // データベース-コレクションの作成(存在しない場合)
    DocumentRepository<TodoDocument>.Initialize();
    
    // 検索条件によるドキュメントの検索
    var document = SearchDocumentByQuery();

    // ドキュメントの更新
    UpdateDocument(document).Wait();
    
    // キー入力があるまでコンソールを表示する
    Console.ReadKey();
}

 Program.csを実行後、Emulatorを更新して該当のドキュメントのプロパティ(isCompletedとcompleteDate)が更新されていれば成功です。

図2 ドキュメントの更新結果
図2 ドキュメントの更新結果

次のページ
ドキュメントの削除

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー