- DocumentDB SQL 教程
- DocumentDB SQL - 主页
- DocumentDB SQL - 概述
- DocumentDB SQL - 选择子句
- DocumentDB SQL - From 子句
- DocumentDB SQL -Where 子句
- DocumentDB SQL - 运算符
- DocumentDB - Between 关键字
- DocumentDB SQL - In 关键字
- DocumentDB SQL - 值关键字
- DocumentDB SQL - Order By 子句
- DocumentDB SQL - 迭代
- DocumentDB SQL - 连接
- DocumentDB SQL - 别名
- DocumentDB SQL - 数组创建
- DocumentDB - 标量表达式
- DocumentDB SQL - 参数化
- DocumentDB SQL - 内置函数
- Linq 到 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!
如上面的输出所示,响应属性具有“Hello, andwelcome to DocumentDB!” 由我们的存储过程返回。