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.