DocumentDB SQL - JavaScript 整合



如今 JavaScript 無處不在,不僅僅侷限於瀏覽器。DocumentDB 將 JavaScript 視為一種現代化的 T-SQL,並原生支援在資料庫引擎內部直接進行 JavaScript 邏輯的事務執行。DocumentDB 提供了一種程式設計模型,可以直接在集合上執行基於 JavaScript 的應用程式邏輯,例如儲存過程和觸發器。

讓我們來看一個建立簡單儲存過程的示例。步驟如下:

步驟 1 - 建立一個新的控制檯應用程式。

步驟 2 - 從 NuGet 新增 .NET SDK。我們在這裡使用 .NET SDK,這意味著我們將編寫一些 C# 程式碼來建立、執行,然後刪除我們的儲存過程,但是儲存過程本身是用 JavaScript 編寫的。

步驟 3 - 在解決方案資源管理器中右鍵單擊專案。

步驟 4 - 為儲存過程新增一個新的 JavaScript 檔案,並將其命名為 HelloWorldStoreProce.js

JavaScript Stored Procedure

每個儲存過程只是一個 JavaScript 函式,因此我們將建立一個新函式,自然地,我們也將此函式命名為HelloWorldStoreProce。我們根本不必為函式命名。DocumentDB 只會透過我們在建立時提供的 ID 來引用此儲存過程。

function HelloWorldStoreProce() { 
   var context = getContext(); 
   var response = context.getResponse(); 
   response.setBody('Hello, and welcome to DocumentDB!'); 
}

所有儲存過程所做的就是從上下文獲取響應物件並呼叫其setBody方法以將字串返回給呼叫者。在 C# 程式碼中,我們將建立儲存過程、執行它,然後刪除它。

儲存過程按集合範圍劃分,因此我們需要集合的 SelfLink 來建立儲存過程。

步驟 5 - 首先查詢myfirstdb資料庫,然後查詢MyCollection集合。

建立儲存過程就像在 DocumentDB 中建立任何其他資源一樣。

private async static Task SimpleStoredProcDemo() {  
   var endpoint = "https://azuredocdbdemo.documents.azure.com:443/"; 
   var masterKey = 
      "BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";
	  
   using (var client = new DocumentClient(new Uri(endpoint), masterKey)) { 
      // Get database 
      Database database = client 
         .CreateDatabaseQuery("SELECT * FROM c WHERE c.id = 'myfirstdb'") 
         .AsEnumerable() 
         .First();
			
      // Get collection 
      DocumentCollection collection = client 
         .CreateDocumentCollectionQuery(database.CollectionsLink, "SELECT * FROM 
         c WHERE c.id = 'MyCollection'") 
         .AsEnumerable() 
         .First();
			
      // Create stored procedure 
      var sprocBody = File.ReadAllText(@"..\..\HelloWorldStoreProce.js"); 
		
      var sprocDefinition = new StoredProcedure { 
         Id = "HelloWorldStoreProce", 
         Body = sprocBody 
      };
	  
      StoredProcedure sproc = await client.
         CreateStoredProcedureAsync(collection.SelfLink, sprocDefinition); 
      Console.WriteLine("Created stored procedure {0} ({1})", 
         sproc.Id, sproc.ResourceId);
				  
      // Execute stored procedure 
      var result = await client.ExecuteStoredProcedureAsync(sproc.SelfLink); 
      Console.WriteLine("Executed stored procedure; response = {0}", result.Response);
	  
      // Delete stored procedure 
      await client.DeleteStoredProcedureAsync(sproc.SelfLink); 
      Console.WriteLine("Deleted stored procedure {0} ({1})", 
         sproc.Id, sproc.ResourceId); 
   }  
} 

步驟 6 - 首先使用新資源的 ID 建立一個定義物件,然後呼叫DocumentClient物件上的 Create 方法之一。對於儲存過程,定義包括 ID 和您想要傳送到伺服器的實際 JavaScript 程式碼。

步驟 7 - 呼叫File.ReadAllText從 JS 檔案中提取儲存過程程式碼。

步驟 8 - 將儲存過程程式碼分配給定義物件的 body 屬性。

就 DocumentDB 而言,我們在定義中指定的 ID 是儲存過程的名稱,無論我們實際將 JavaScript 函式命名為何物。

然而,在建立儲存過程和其他伺服器端物件時,建議我們命名 JavaScript 函式,並且這些函式名稱與我們在 DocumentDB 定義中設定的 ID 匹配。

步驟 9 - 呼叫CreateStoredProcedureAsync,傳入MyCollection集合的SelfLink和儲存過程定義。這將建立儲存過程和 DocumentDB 為其分配的ResourceId

步驟 10 - 呼叫儲存過程。ExecuteStoredProcedureAsync採用一個型別引數,您將其設定為儲存過程返回的值的預期資料型別,如果您希望返回動態物件,則可以將其簡單地指定為物件。這是一個在執行時繫結其屬性的物件。

在這個例子中,我們知道我們的儲存過程只返回一個字串,所以我們呼叫ExecuteStoredProcedureAsync<string>

以下是 Program.cs 檔案的完整實現。

using Microsoft.Azure.Documents; 
using Microsoft.Azure.Documents.Client; 
using Microsoft.Azure.Documents.Linq; 

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.IO; 

using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
 
namespace DocumentDBStoreProce { 
   class Program { 
      private static void Main(string[] args) { 
         Task.Run(async () => { 
            await SimpleStoredProcDemo(); 
         }).Wait(); 
      } 
	  
      private async static Task SimpleStoredProcDemo() {  
         var endpoint = "https://azuredocdbdemo.documents.azure.com:443/"; 
         var masterKey = 
            "BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";  
				
         using (var client = new DocumentClient(new Uri(endpoint), masterKey)) { 
            // Get database 
            Database database = client 
               .CreateDatabaseQuery("SELECT * FROM c WHERE c.id = 'myfirstdb'")
               .AsEnumerable() 
               .First(); 
					
            // Get collection 
            DocumentCollection collection = client 
               .CreateDocumentCollectionQuery(database.CollectionsLink, 
               "SELECT * FROM c WHERE c.id = 'MyCollection'") 
               .AsEnumerable() 
               .First();
					 
            // Create stored procedure 
            var sprocBody = File.ReadAllText(@"..\..\HelloWorldStoreProce.js"); 
				
            var sprocDefinition = new StoredProcedure { 
               Id = "HelloWorldStoreProce", 
               Body = sprocBody 
            };
			
            StoredProcedure sproc = await client
               .CreateStoredProcedureAsync(collection.SelfLink, sprocDefinition);
					
            Console.WriteLine("Created stored procedure {0} ({1})", sproc
               .Id, sproc.ResourceId);
					 
            // Execute stored procedure 
            var result = await client
               .ExecuteStoredProcedureAsync<string>(sproc.SelfLink); 
            Console.WriteLine("Executed stored procedure; response = {0}", 
               result.Response);
					
            // Delete stored procedure 
            await client.DeleteStoredProcedureAsync(sproc.SelfLink); 
            Console.WriteLine("Deleted stored procedure {0} ({1})", 
               sproc.Id, sproc.ResourceId); 
         } 
      } 
   } 
} 					

執行上述程式碼後,將產生以下輸出。

Created stored procedure HelloWorldStoreProce (Ic8LAMEUVgACAAAAAAAAgA==)

Executed stored procedure; response = Hello, and welcome to DocumentDB!	 

如上述輸出所示,response 屬性包含我們的儲存過程返回的“Hello, and welcome to DocumentDB!”。

廣告
© . All rights reserved.