DocumentDB SQL - Tích hợp JavaScript
Ngày nay JavaScript có mặt ở khắp mọi nơi, không chỉ trong các trình duyệt. DocumentDB bao hàm JavaScript như một loại T-SQL hiện đại và hỗ trợ thực thi giao dịch của logic JavaScript nguyên bản, ngay bên trong công cụ cơ sở dữ liệu. DocumentDB cung cấp một mô hình lập trình để thực thi logic ứng dụng dựa trên JavaScript trực tiếp trên các tập hợp về các thủ tục và trình kích hoạt được lưu trữ.
Hãy xem một ví dụ mà chúng ta tạo một thủ tục cửa hàng đơn giản. Sau đây là các bước -
Step 1 - Tạo một ứng dụng console mới.
Step 2- Thêm SDK .NET từ NuGet. Chúng tôi đang sử dụng .NET SDK ở đây, có nghĩa là chúng tôi sẽ viết một số mã C # để tạo, thực thi và sau đó xóa thủ tục đã lưu trữ của chúng tôi, nhưng bản thân thủ tục được lưu trữ được viết bằng JavaScript.
Step 3 - Nhấp chuột phải vào dự án trong Trình khám phá giải pháp.
Step 4 - Thêm tệp JavaScript mới cho thủ tục được lưu trữ và gọi nó là HelloWorldStoreProce.js
Mọi thủ tục được lưu trữ chỉ là một hàm JavaScript nên chúng tôi sẽ tạo một hàm mới và đương nhiên chúng tôi cũng sẽ đặt tên cho hàm này HelloWorldStoreProce. Không quan trọng nếu chúng ta đặt tên cho hàm. DocumentDB sẽ chỉ tham chiếu đến quy trình được lưu trữ này bởi Id mà chúng tôi cung cấp khi chúng tôi tạo nó.
function HelloWorldStoreProce() {
var context = getContext();
var response = context.getResponse();
response.setBody('Hello, and welcome to DocumentDB!');
}
Tất cả các thủ tục được lưu trữ là lấy đối tượng phản hồi từ ngữ cảnh và gọi setBodyđể trả về một chuỗi cho trình gọi. Trong mã C #, chúng tôi sẽ tạo thủ tục được lưu trữ, thực thi nó và sau đó xóa nó.
Các thủ tục đã lưu trữ được xác định phạm vi cho mỗi tập hợp, do đó chúng tôi sẽ cần Liên kết tự liên kết của tập hợp để tạo thủ tục được lưu trữ.
Step 5 - Truy vấn đầu tiên cho myfirstdb cơ sở dữ liệu và sau đó cho MyCollection bộ sưu tập.
Tạo một thủ tục được lưu trữ cũng giống như tạo bất kỳ tài nguyên nào khác trong 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); } }
Step 6 - Đầu tiên tạo một đối tượng định nghĩa với Id cho tài nguyên mới và sau đó gọi một trong các phương thức Tạo trên DocumentClientvật. Trong trường hợp thủ tục được lưu trữ, định nghĩa bao gồm Id và mã JavaScript thực mà bạn muốn chuyển đến máy chủ.
Step 7 - Gọi File.ReadAllText để trích xuất mã thủ tục đã lưu trữ ra khỏi tệp JS.
Step 8 - Gán mã thủ tục đã lưu trữ cho thuộc tính body của đối tượng định nghĩa.
Theo như DocumentDB có liên quan, Id chúng tôi chỉ định ở đây, trong định nghĩa, là tên của thủ tục được lưu trữ, bất kể chúng tôi thực sự đặt tên cho hàm JavaScript là gì.
Tuy nhiên, khi tạo các thủ tục được lưu trữ và các đối tượng phía máy chủ khác, chúng ta nên đặt tên cho các hàm JavaScript và các tên hàm đó khớp với Id mà chúng ta đã đặt trong định nghĩa cho DocumentDB.
Step 9 - Gọi CreateStoredProcedureAsync, đi qua SelfLink cho MyCollectiontập hợp và định nghĩa thủ tục được lưu trữ. Điều này tạo ra thủ tục được lưu trữ vàResourceId DocumentDB được gán cho nó.
Step 10 - Gọi thủ tục đã lưu trữ. ExecuteStoredProcedureAsyncnhận một tham số kiểu mà bạn đặt thành kiểu dữ liệu mong đợi của giá trị được trả về bởi thủ tục được lưu trữ, mà bạn có thể chỉ định đơn giản là một đối tượng nếu bạn muốn một đối tượng động được trả về. Đó là một đối tượng có thuộc tính sẽ bị ràng buộc tại thời điểm chạy.
Trong ví dụ này, chúng tôi biết rằng thủ tục được lưu trữ của chúng tôi chỉ trả về một chuỗi và vì vậy chúng tôi gọi ExecuteStoredProcedureAsync<string>.
Sau đây là quá trình triển khai hoàn chỉnh của tệp 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);
}
}
}
}
Khi đoạn mã trên được thực thi, nó sẽ tạo ra kết quả sau.
Created stored procedure HelloWorldStoreProce (Ic8LAMEUVgACAAAAAAAAgA==)
Executed stored procedure; response = Hello, and welcome to DocumentDB!
Như đã thấy trong đầu ra ở trên, thuộc tính phản hồi có "Xin chào và chào mừng bạn đến với DocumentDB!" trả lại bằng thủ tục lưu trữ của chúng tôi.