DocumentDB SQL – Integración de JavaScript

JavaScript está en todas partes en estos días, no solo en los navegadores. DocumentDB usa JavaScript como una especie de T-SQL moderno y admite la ejecución transaccional de la lógica de JavaScript de forma nativa, directamente dentro del motor de la base de datos. DocumentDB proporciona un modelo de programación para ejecutar la lógica de la aplicación basada en JavaScript directamente en colecciones en términos de procedimientos almacenados y desencadenadores.

Echemos un vistazo a un ejemplo en el que creamos una rutina de almacenamiento simple. Los siguientes son los pasos:

Paso 1 – Crea nuevas aplicaciones de consola.

Paso 2 – Agregue.NET SDK de NuGet. Aquí estamos usando.NET SDK, lo que significa que escribiremos código C # para crear, ejecutar y luego eliminar nuestro procedimiento almacenado, pero el procedimiento almacenado en sí se escribirá en JavaScript.

Paso 3 – Haga clic derecho en el proyecto en el Explorador de soluciones.

Paso 4 – Agregue un nuevo archivo JavaScript para el procedimiento almacenado y asígnele el nombre HelloWorldStoreProce.js.

Procedimiento almacenado de JavaScript

Cada procedimiento almacenado es solo una función de JavaScript, por lo que crearemos una nueva función y, naturalmente, también llamaremos a esta función HelloWorldStoreProce… No importa si le damos el nombre de la función. DocumentDB solo hará referencia a este procedimiento almacenado por el ID que proporcionamos cuando lo creamos.

function HelloWorldStoreProce() { 
   var context = getContext(); 
   var response = context.getResponse(); 
   response.setBody('Hello, and welcome to DocumentDB!'); 
}

Todo lo que hace el procedimiento almacenado es obtener el objeto de respuesta del contexto y llamarlo setBody para devolver la cadena a la persona que llama. En el código C #, crearemos un procedimiento almacenado, lo ejecutaremos y luego lo eliminaremos.

Los procedimientos almacenados están limitados por colección, por lo que necesitamos la colección SelfLink para crear el procedimiento almacenado.

Paso 5 – Primera solicitud de myfirstdb base de datos y luego para Mi colección colección.

La creación de un procedimiento almacenado es similar a la creación de cualquier otro recurso en 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); 
   }  
} 

PASO 6 – Primero cree un objeto de definición con un ID para el nuevo recurso y luego llame a uno de los métodos Create en DocumentClient un objeto. En el caso de un procedimiento almacenado, la definición incluye el identificador y el JavaScript real que desea enviar al servidor.

Paso 7 – Llamada File.ReadAllText para extraer el código del procedimiento almacenado del archivo JS.

Paso 8 – Asignar el código del procedimiento almacenado a la propiedad del cuerpo del objeto de definición.

En lo que respecta a DocumentDB, el identificador que especificamos aquí en la definición es el nombre del procedimiento almacenado, independientemente de cómo llamemos realmente a la función JavaScript.

Sin embargo, al crear procedimientos almacenados y otros objetos del lado del servidor, se recomienda que asigne un nombre a sus funciones de JavaScript y que estos nombres de funciones coincidan con el identificador que establecimos en la definición de DocumentDB.

Paso 9 – Llamada CreateStoredProcedureAsyncentrar en SelfLink por Mi colección recopilación y definición de un procedimiento almacenado. Esto crea un procedimiento almacenado y ResourceId el DocumentDB asignado.

Paso 10. – Llamar a un procedimiento almacenado. ExecuteStoredProcedureAsync toma un parámetro de tipo que establece para el tipo de datos esperado del valor devuelto por el procedimiento almacenado, que puede especificar simplemente como un objeto si desea que se devuelva un objeto dinámico. Este es un objeto cuyas propiedades estarán vinculadas en tiempo de ejecución.

En este ejemplo, sabemos que nuestro procedimiento almacenado solo devuelve una cadena, por lo que llamamos ExecuteStoredProcedureAsync <строка>

A continuación se muestra la implementación completa del archivo 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); 
         } 
      } 
   } 
} 					

Cuando se ejecuta el código anterior, da el siguiente resultado.

Created stored procedure HelloWorldStoreProce (Ic8LAMEUVgACAAAAAAAAgA==)

Executed stored procedure; response = Hello, and welcome to DocumentDB!	 

Como puede ver en el resultado anterior, la propiedad de respuesta dice «¡Hola y bienvenido a DocumentDB!» devuelto por nuestro procedimiento almacenado.

🚫