DocumentDB - Tài liệu Truy vấn

Trong DocumentDB, chúng tôi thực sự sử dụng SQL để truy vấn tài liệu, vì vậy chương này là tất cả về truy vấn bằng cú pháp SQL đặc biệt trong DocumentDB. Mặc dù nếu bạn đang phát triển .NET, thì cũng có một trình cung cấp LINQ có thể được sử dụng và có thể tạo SQL thích hợp từ một truy vấn LINQ.

Truy vấn tài liệu bằng Cổng thông tin

Cổng Azure có Trình khám phá truy vấn cho phép bạn chạy bất kỳ truy vấn SQL nào dựa trên cơ sở dữ liệu DocumentDB của bạn.

Chúng tôi sẽ sử dụng Trình khám phá truy vấn để chứng minh nhiều khả năng và tính năng khác nhau của ngôn ngữ truy vấn bắt đầu với truy vấn đơn giản nhất có thể.

Step 1 - Trong phiến cơ sở dữ liệu, bấm để mở phiến Query Explorer.

Hãy nhớ rằng các truy vấn chạy trong phạm vi của một bộ sưu tập và do đó, Trình khám phá Truy vấn cho phép bạn chọn bộ sưu tập trong menu thả xuống này.

Step 2 - Chọn bộ sưu tập Gia đình được tạo trước đó bằng cổng thông tin.

Trình khám phá truy vấn mở ra với truy vấn đơn giản SELECT * FROM c này, truy vấn này chỉ đơn giản là lấy tất cả các tài liệu từ bộ sưu tập.

Step 3- Thực hiện truy vấn này bằng cách nhấp vào nút 'Chạy truy vấn'. Sau đó, bạn sẽ thấy rằng tài liệu hoàn chỉnh được truy xuất trong thanh Kết quả.

Truy vấn tài liệu bằng .Net SDK

Sau đây là các bước để chạy một số truy vấn tài liệu bằng .Net SDK.

Trong ví dụ này, chúng tôi muốn truy vấn các tài liệu mới được tạo mà chúng tôi vừa thêm vào.

Step 1 - Gọi CreateDocumentQuery, truyền vào bộ sưu tập để chạy truy vấn bằng SelfLink của nó và văn bản truy vấn.

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(); 
}

Truy vấn này cũng trả lại tất cả các tài liệu trong toàn bộ bộ sưu tập, nhưng chúng tôi không gọi .ToList trên CreateDocumentQuery như trước đây, điều này sẽ đưa ra nhiều yêu cầu nếu cần để kéo xuống tất cả kết quả trong một dòng mã.

Step 2 - Thay vào đó, hãy gọi AsDocumentQuery và phương thức này trả về một đối tượng truy vấn có thuộc tính HasMoreResults.

Step 3 - Nếu HasMoreResults là true thì gọi ExecuteNextAsync để lấy đoạn tiếp theo rồi kết xuất tất cả nội dung của đoạn đó.

Step 4- Bạn cũng có thể truy vấn bằng LINQ thay vì SQL nếu muốn. Ở đây chúng tôi đã xác định một truy vấn LINQ trong q, nhưng nó sẽ không thực thi cho đến khi chúng tôi chạy. Danh sách trên đó.

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 sẽ chuyển đổi truy vấn LINQ của chúng tôi thành cú pháp SQL cho DocumentDB, tạo mệnh đề SELECT và WHERE dựa trên cú pháp LINQ của chúng tôi

Step 5 - Bây giờ gọi các truy vấn trên từ tác vụ 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); 
   } 
	
}

Khi đoạn mã trên được thực thi, bạn sẽ nhận được kết quả sau.

**** 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