DocumentDB-クエリドキュメント

DocumentDBでは、実際にSQLを使用してドキュメントをクエリするため、この章では、DocumentDBの特別なSQL構文を使用したクエリについて説明します。.NET開発を行っている場合でも、使用でき、LINQクエリから適切なSQLを生成できるLINQプロバイダーもあります。

ポータルを使用したドキュメントのクエリ

Azureポータルにはクエリエクスプローラーがあり、DocumentDBデータベースに対して任意のSQLクエリを実行できます。

クエリエクスプローラーを使用して、可能な限り単純なクエリから始めて、クエリ言語のさまざまな機能を示します。

Step 1 −データベースブレードで、クリックしてクエリエクスプローラーブレードを開きます。

クエリはコレクションのスコープ内で実行されるため、クエリエクスプローラーではこのドロップダウンでコレクションを選択できます。

Step 2 −ポータルを使用して以前に作成したFamiliesコレクションを選択します。

クエリエクスプローラーは、この単純なクエリSELECT * FROM cで開きます。これは、コレクションからすべてのドキュメントを取得するだけです。

Step 3− [クエリの実行]ボタンをクリックして、このクエリを実行します。次に、完全なドキュメントが結果ブレードに取得されていることがわかります。

.NetSDKを使用したドキュメントのクエリ

以下は、.NetSDKを使用していくつかのドキュメントクエリを実行する手順です。

この例では、追加したばかりの新しく作成されたドキュメントをクエリします。

Step 1 − CreateDocumentQueryを呼び出し、コレクションを渡して、SelfLinkとクエリテキストによってクエリを実行します。

private async static Task QueryDocumentsWithPaging(DocumentClient client) {
   Console.WriteLine(); 
   Console.WriteLine("**** Query Documents (paged results) ****"); 
   Console.WriteLine();  
   Console.WriteLine("Quering for all documents"); 
	
   var sql = "SELECT * FROM c";  
   var query = client.CreateDocumentQuery(collection.SelfLink, sql).AsDocumentQuery();
	
   while (query.HasMoreResults) {
      var documents = await query.ExecuteNextAsync(); 
		
      foreach (var document in documents) { 
         Console.WriteLine(" Id: {0}; Name: {1};", document.id, document.name); 
      } 
   }
	
   Console.WriteLine(); 
}

このクエリはコレクション全体のすべてのドキュメントも返しますが、CreateDocumentQueryで.ToListを呼び出すことはありません。これにより、すべての結果を1行のコードでプルダウンするために必要な数のリクエストが発行されます。

Step 2 −代わりに、AsDocumentQueryを呼び出すと、このメソッドはHasMoreResultsプロパティを持つクエリオブジェクトを返します。

Step 3 − HasMoreResultsがtrueの場合、ExecuteNextAsyncを呼び出して次のチャンクを取得し、そのチャンクのすべての内容をダンプします。

Step 4−必要に応じて、SQLの代わりにLINQを使用してクエリを実行することもできます。ここでは、qでLINQクエリを定義しましたが、.ToListを実行するまで実行されません。

private static void QueryDocumentsWithLinq(DocumentClient client) {
   Console.WriteLine(); 
   Console.WriteLine("**** Query Documents (LINQ) ****"); 
   Console.WriteLine();  
   Console.WriteLine("Quering for US customers (LINQ)");
	
   var q = 
      from d in client.CreateDocumentQuery<Customer>(collection.DocumentsLink) 
      where d.Address.CountryRegionName == " United States" 
      select new {
         Id = d.Id, 
         Name = d.Name, 
         City = d.Address.Location.City 
      };  
		
   var documents = q.ToList();  
   Console.WriteLine("Found {0} UK customers", documents.Count);
	
   foreach (var document in documents) {
      var d = document as dynamic; 
      Console.WriteLine(" Id: {0}; Name: {1}; City: {2}", d.Id, d.Name, d.City); 
   } 
	
   Console.WriteLine(); 
}

SDKは、LINQクエリをDocumentDBのSQL構文に変換し、LINQ構文に基づいてSELECT句とWHERE句を生成します。

Step 5 −次に、CreateDocumentClientタスクから上記のクエリを呼び出します。

private static async Task CreateDocumentClient() { 
   // Create a new instance of the DocumentClient 
	
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
      database = client.CreateDatabaseQuery("SELECT * FROM c WHERE c.id =
         'myfirstdb'").AsEnumerable().First(); 
			
      collection = client.CreateDocumentCollectionQuery(database.CollectionsLink,
         "SELECT * FROM c WHERE c.id = 'MyCollection'").AsEnumerable().First();  
			
      //await CreateDocuments(client); 
      await QueryDocumentsWithPaging(client); 
      QueryDocumentsWithLinq(client); 
   } 
	
}

上記のコードを実行すると、次の出力が表示されます。

**** Query Documents (paged results) ****  
Quering for all documents 
 Id: 7e9ad4fa-c432-4d1a-b120-58fd7113609f; Name: New Customer 1; 
 Id: 34e9873a-94c8-4720-9146-d63fb7840fad; Name: New Customer 1;  
 
**** Query Documents (LINQ) **** 
Quering for US customers (LINQ) 
Found 2 UK customers 
 Id: 7e9ad4fa-c432-4d1a-b120-58fd7113609f; Name: New Customer 1; City: Brooklyn 
 Id: 34e9873a-94c8-4720-9146-d63fb7840fad; Name: New Customer 1; City: Brooklyn