Cosmos DBアプリで検索/更新/削除機能を実装する
Microsoft AzureのNoSQLデータベース「Cosmos DB」を使ってみよう 第4回
本連載では、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に示します。
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」としてください。
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)を設定してドキュメントを作成します。
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を受け取ってドキュメントを検索し、コンソール上に出力します。
static async Task SearchDocumentById(string id)
{
// IDによるドキュメントの検索
var document = await DocumentRepository<TodoDocument>.GetDocumentByIdAsync(id);
// ドキュメントを整形してコンソールに出力する
Console.WriteLine(JsonConvert.SerializeObject(document, Formatting.Indented));
}
Mainメソッドはこれらの追加したメソッドを呼び出すように修正します。
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による検索を行うことができました。
この記事は参考になりましたか?
- Microsoft AzureのNoSQLデータベース「Cosmos DB」を使ってみよう連載記事一覧
-
- Microsoft AzureのNoSQLデータベース「Cosmos DB」における運用時...
- Cosmos DBアプリで検索/更新/削除機能を実装する
- 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編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
