DocumentDB SQL - Integrazione JavaScript

Oggigiorno JavaScript è ovunque e non solo nei browser. DocumentDB abbraccia JavaScript come una sorta di T-SQL moderno e supporta l'esecuzione transazionale della logica JavaScript in modo nativo, direttamente all'interno del motore di database. DocumentDB fornisce un modello di programmazione per eseguire la logica dell'applicazione basata su JavaScript direttamente sulle raccolte in termini di stored procedure e trigger.

Diamo un'occhiata a un esempio in cui creiamo una semplice procedura di negozio. Di seguito sono riportati i passaggi:

Step 1 - Crea nuove applicazioni console.

Step 2- Aggiungi in .NET SDK da NuGet. Stiamo usando .NET SDK qui, il che significa che scriveremo del codice C # per creare, eseguire e quindi eliminare la nostra stored procedure, ma la stored procedure stessa viene scritta in JavaScript.

Step 3 - Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni.

Step 4 - Aggiungi un nuovo file JavaScript per la stored procedure e chiamalo HelloWorldStoreProce.js

Ogni procedura memorizzata è solo una funzione JavaScript, quindi creeremo una nuova funzione e naturalmente chiameremo anche questa funzione HelloWorldStoreProce. Non importa se diamo un nome alla funzione. DocumentDB farà riferimento a questa procedura memorizzata solo tramite l'ID che forniamo quando la creiamo.

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

Tutto ciò che la stored procedure fa è ottenere l'oggetto risposta dal contesto e chiamarlo setBodymetodo per restituire una stringa al chiamante. Nel codice C # creeremo la stored procedure, la eseguiremo e quindi la elimineremo.

Le stored procedure hanno un ambito per raccolta, quindi avremo bisogno del SelfLink della raccolta per creare la stored procedure.

Step 5 - Prima query per il myfirstdb database e poi per il MyCollection collezione.

La creazione di una stored procedure è proprio come la creazione di qualsiasi altra risorsa in 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); } } 
      

Step 6 - Creare prima un oggetto di definizione con l'ID per la nuova risorsa e quindi chiamare uno dei metodi Create nel file DocumentClientoggetto. Nel caso di una procedura memorizzata, la definizione include l'ID e il codice JavaScript effettivo che si desidera inviare al server.

Step 7 - Chiama File.ReadAllText per estrarre il codice della procedura memorizzata dal file JS.

Step 8 - Assegna il codice della procedura memorizzata alla proprietà body dell'oggetto definizione.

Per quanto riguarda DocumentDB, l'Id che specifichiamo qui, nella definizione, è il nome della stored procedure, indipendentemente da quello che chiamiamo effettivamente la funzione JavaScript.

Tuttavia, quando si creano stored procedure e altri oggetti lato server, si consiglia di denominare le funzioni JavaScript e che tali nomi di funzione corrispondano all'ID che abbiamo impostato nella definizione di DocumentDB.

Step 9 - Chiama CreateStoredProcedureAsync, passando nel SelfLink per il MyCollectionraccolta e la definizione della procedura memorizzata. Questo crea la stored procedure eResourceId quel DocumentDB assegnato ad esso.

Step 10 - Chiama la procedura memorizzata. ExecuteStoredProcedureAsyncaccetta un parametro di tipo impostato sul tipo di dati previsto del valore restituito dalla procedura memorizzata, che è possibile specificare semplicemente come oggetto se si desidera restituire un oggetto dinamico. Questo è un oggetto le cui proprietà verranno associate in fase di esecuzione.

In questo esempio sappiamo che la nostra stored procedure restituisce solo una stringa e quindi chiamiamo ExecuteStoredProcedureAsync<string>.

Di seguito è riportata l'implementazione completa del file 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 il codice precedente viene eseguito, produce il seguente output.

Created stored procedure HelloWorldStoreProce (Ic8LAMEUVgACAAAAAAAAgA==)

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

Come si vede nell'output sopra, la proprietà response ha "Hello e welcome to DocumentDB!" restituito dalla nostra procedura memorizzata.