В наши дни JavaScript есть везде, а не только в браузерах. DocumentDB использует JavaScript как своего рода современный T-SQL и изначально поддерживает транзакционное выполнение логики JavaScript прямо в ядре базы данных. DocumentDB предоставляет программную модель для выполнения логики приложения на основе JavaScript непосредственно в коллекциях с точки зрения хранимых процедур и триггеров.
Давайте рассмотрим пример, в котором мы создаем простую процедуру хранения. Ниже приведены шаги —
Шаг 1 — Создание новых консольных приложений.
Шаг 2 — Добавьте .NET SDK от NuGet. Мы используем .NET SDK здесь, что означает, что мы напишем некоторый код C # для создания, выполнения и удаления нашей хранимой процедуры, но сама хранимая процедура написана на JavaScript.
Шаг 3 — Щелкните правой кнопкой мыши проект в обозревателе решений.
Шаг 4. Добавьте новый файл JavaScript для хранимой процедуры и назовите его HelloWorldStoreProce.js.
Каждая хранимая процедура — это просто функция JavaScript, поэтому мы создадим новую функцию и, естественно, также назовем эту функцию HelloWorldStoreProce . Неважно, если мы дадим имя функции вообще. DocumentDB будет ссылаться на эту хранимую процедуру только по идентификатору, который мы предоставляем при ее создании.
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. Сначала создайте объект определения с идентификатором для нового ресурса, а затем вызовите один из методов Create для объекта DocumentClient . В случае хранимой процедуры определение включает в себя Id и фактический код JavaScript, который вы хотите отправить на сервер.
Шаг 7 — Вызовите File.ReadAllText, чтобы извлечь код хранимой процедуры из файла JS.
Шаг 8 — Присвойте код хранимой процедуры свойству body объекта определения.
Что касается DocumentDB, то идентификатор, который мы здесь указываем в определении, является именем хранимой процедуры, независимо от того, что мы на самом деле называем функцией JavaScript.
Тем не менее, при создании хранимых процедур и других серверных объектов рекомендуется, чтобы мы называли функции JavaScript и чтобы эти имена соответствовали идентификатору, который мы установили в определении для DocumentDB.
Шаг 9 — Вызов CreateStoredProcedureAsync , передавая SelfLink для коллекции MyCollection и определения хранимой процедуры. Это создает хранимую процедуру и ResourceId , назначенный ей DocumentDB.
Шаг 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 и добро пожаловать в DocumentDB!», Возвращаемое нашей хранимой процедурой.