- DocumentDB SQL 教程
- DocumentDB SQL - 首頁
- DocumentDB SQL - 概述
- DocumentDB SQL - SELECT 語句
- DocumentDB SQL - FROM 語句
- DocumentDB SQL - WHERE 語句
- DocumentDB SQL - 運算子
- DocumentDB - BETWEEN 關鍵字
- DocumentDB SQL - IN 關鍵字
- DocumentDB SQL - VALUE 關鍵字
- DocumentDB SQL - ORDER BY 語句
- DocumentDB SQL - 迭代
- DocumentDB SQL - 連線
- DocumentDB SQL - 別名
- DocumentDB SQL - 陣列建立
- DocumentDB - 標量表達式
- DocumentDB SQL - 引數化
- DocumentDB SQL - 內建函式
- LINQ to SQL 轉換
- JavaScript 整合
- 使用者自定義函式
- 複合 SQL 查詢
- DocumentDB SQL 有用資源
- DocumentDB SQL - 快速指南
- DocumentDB SQL - 有用資源
- DocumentDB SQL - 討論
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 函式,因此我們將建立一個新函式,自然地,我們也將此函式命名為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!”。