対象読者
- 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による検索を行うことができました。