DocumentDB - 查詢文件



在 DocumentDB 中,我們實際上使用 SQL 來查詢文件,因此本章將重點介紹使用 DocumentDB 中特殊的 SQL 語法進行查詢。但是,如果您正在進行 .NET 開發,也可以使用 LINQ 提供程式,該程式可以根據 LINQ 查詢生成相應的 SQL。

使用門戶查詢文件

Azure 門戶具有一個查詢資源管理器,允許您對 DocumentDB 資料庫執行任何 SQL 查詢。

我們將使用查詢資源管理器演示查詢語言的許多不同功能和特性,從最簡單的查詢開始。

步驟 1 - 在資料庫面板中,單擊以開啟查詢資源管理器面板。

Query Explorer Blade

請記住,查詢在集合的範圍內執行,因此查詢資源管理器允許您在此下拉列表中選擇集合。

Run Query

步驟 2 - 選擇前面使用門戶建立的 Families 集合。

查詢資源管理器將開啟此簡單的查詢 SELECT * FROM c,它只是從集合中檢索所有文件。

步驟 3 - 單擊“執行查詢”按鈕執行此查詢。然後,您將看到完整的文件已在“結果”面板中檢索。

Document in Result Blade

使用 .Net SDK 查詢文件

以下是使用 .Net SDK 執行一些文件查詢的步驟。

在此示例中,我們想要查詢剛剛新增的新建立的文件。

步驟 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,這將發出儘可能多的請求以在一行程式碼中下載所有結果。

步驟 2 - 相反,呼叫 AsDocumentQuery,此方法返回一個具有 HasMoreResults 屬性的查詢物件。

步驟 3 - 如果 HasMoreResults 為 true,則呼叫 ExecuteNextAsync 獲取下一塊,然後轉儲該塊的所有內容。

步驟 4 - 如果您願意,也可以使用 LINQ 而不是 SQL 進行查詢。在這裡,我們在 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 子句。

步驟 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
廣告
© . All rights reserved.