DocumentDB SQL - Integração com JavaScript
Atualmente, o JavaScript está em todo lugar, não apenas nos navegadores. O DocumentDB adota o JavaScript como uma espécie de T-SQL moderno e oferece suporte à execução transacional da lógica do JavaScript nativamente, dentro do mecanismo de banco de dados. O DocumentDB fornece um modelo de programação para executar a lógica do aplicativo baseado em JavaScript diretamente nas coleções em termos de procedimentos armazenados e gatilhos.
Vamos dar uma olhada em um exemplo em que criamos um procedimento de armazenamento simples. A seguir estão as etapas -
Step 1 - Crie um novo aplicativo de console.
Step 2- Adicione o .NET SDK do NuGet. Estamos usando o .NET SDK aqui, o que significa que escreveremos algum código C # para criar, executar e, em seguida, excluir nosso procedimento armazenado, mas o próprio procedimento armazenado é escrito em JavaScript.
Step 3 - Clique com o botão direito do mouse no projeto no Solution explorer.
Step 4 - Adicione um novo arquivo JavaScript para o procedimento armazenado e chame-o de HelloWorldStoreProce.js
Cada procedimento armazenado é apenas uma função JavaScript, então criaremos uma nova função e, naturalmente, também nomearemos esta função HelloWorldStoreProce. Não importa se dermos um nome à função. O Banco de Dados de Documentos só fará referência a este procedimento armazenado pelo Id que fornecemos ao criá-lo.
function HelloWorldStoreProce() {
var context = getContext();
var response = context.getResponse();
response.setBody('Hello, and welcome to DocumentDB!');
}
Tudo o que o procedimento armazenado faz é obter o objeto de resposta do contexto e chamar seu setBodymétodo para retornar uma string para o chamador. No código C #, vamos criar o procedimento armazenado, executá-lo e, em seguida, excluí-lo.
Os procedimentos armazenados têm o escopo definido por coleção, portanto, precisaremos do SelfLink da coleção para criar o procedimento armazenado.
Step 5 - Primeira consulta para o myfirstdb banco de dados e então para o MyCollection coleção.
Criar um procedimento armazenado é como criar qualquer outro recurso no Banco de Dados de Documentos.
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 - Primeiro crie um objeto de definição com o Id para o novo recurso e, em seguida, chame um dos métodos Create no DocumentClientobjeto. No caso de um procedimento armazenado, a definição inclui o Id e o código JavaScript real que você deseja enviar para o servidor.
Step 7 - Ligue File.ReadAllText para extrair o código do procedimento armazenado do arquivo JS.
Step 8 - Atribua o código de procedimento armazenado à propriedade body do objeto de definição.
No que diz respeito ao Banco de Dados de Documentos, o Id que especificamos aqui, na definição, é o nome do procedimento armazenado, independentemente de como realmente nomeamos a função JavaScript.
No entanto, ao criar procedimentos armazenados e outros objetos do lado do servidor, é recomendável nomear as funções JavaScript e que esses nomes de função correspondam ao Id que definimos na base de dados de documentos.
Step 9 - Ligue CreateStoredProcedureAsync, passando no SelfLink para o MyCollectioncoleção e a definição do procedimento armazenado. Isso cria o procedimento armazenado eResourceId que o Banco de Dados de Documentos atribuído a ele.
Step 10 - Chame o procedimento armazenado. ExecuteStoredProcedureAsyncusa um parâmetro de tipo que você define para o tipo de dados esperado do valor retornado pelo procedimento armazenado, que você pode especificar simplesmente como um objeto se quiser um objeto dinâmico retornado. Esse é um objeto cujas propriedades serão vinculadas em tempo de execução.
Neste exemplo, sabemos que nosso procedimento armazenado está apenas retornando uma string e então chamamos ExecuteStoredProcedureAsync<string>.
A seguir está a implementação completa do arquivo 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);
}
}
}
}
Quando o código acima é executado, ele produz a seguinte saída.
Created stored procedure HelloWorldStoreProce (Ic8LAMEUVgACAAAAAAAAgA==)
Executed stored procedure; response = Hello, and welcome to DocumentDB!
Conforme visto na saída acima, a propriedade de resposta tem o "Olá, e bem-vindo ao Banco de Dados de Documentos!" retornado por nosso procedimento armazenado.