DocumentDB SQL - Intégration JavaScript

De nos jours, JavaScript est partout, et pas seulement dans les navigateurs. DocumentDB embrasse JavaScript comme une sorte de T-SQL moderne et prend en charge l'exécution transactionnelle de la logique JavaScript de manière native, directement dans le moteur de base de données. DocumentDB fournit un modèle de programmation pour exécuter la logique d'application basée sur JavaScript directement sur les collections en termes de procédures stockées et de déclencheurs.

Jetons un coup d'œil à un exemple où nous créons une procédure de stockage simple. Voici les étapes -

Step 1 - Créez de nouvelles applications de console.

Step 2- Ajoutez le SDK .NET de NuGet. Nous utilisons le SDK .NET ici, ce qui signifie que nous allons écrire du code C # pour créer, exécuter, puis supprimer notre procédure stockée, mais la procédure stockée elle-même est écrite en JavaScript.

Step 3 - Cliquez avec le bouton droit sur le projet dans l'explorateur de solutions.

Step 4 - Ajoutez un nouveau fichier JavaScript pour la procédure stockée et appelez-le HelloWorldStoreProce.js

Chaque procédure stockée n'est qu'une fonction JavaScript, nous allons donc créer une nouvelle fonction et naturellement nous nommerons également cette fonction HelloWorldStoreProce. Peu importe que nous donnions un nom à la fonction. DocumentDB ne fera référence à cette procédure stockée que par l'ID que nous fournissons lorsque nous la créons.

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

Tout ce que fait la procédure stockée est d'obtenir l'objet de réponse à partir du contexte et d'appeler son setBodypour renvoyer une chaîne à l'appelant. Dans le code C #, nous allons créer la procédure stockée, l'exécuter, puis la supprimer.

Les procédures stockées sont étendues par collection, nous aurons donc besoin du SelfLink de la collection pour créer la procédure stockée.

Step 5 - Première requête pour le myfirstdb base de données puis pour la MyCollection collection.

La création d'une procédure stockée est comme la création de toute autre ressource dans 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 - Créez d'abord un objet de définition avec l'ID de la nouvelle ressource, puis appelez l'une des méthodes Create sur le DocumentClientobjet. Dans le cas d'une procédure stockée, la définition comprend l'ID et le code JavaScript réel que vous souhaitez envoyer au serveur.

Step 7 - Appeler File.ReadAllText pour extraire le code de procédure stockée du fichier JS.

Step 8 - Attribuez le code de procédure stockée à la propriété body de l'objet de définition.

En ce qui concerne DocumentDB, l'ID que nous spécifions ici, dans la définition, est le nom de la procédure stockée, quel que soit le nom que nous nommons réellement la fonction JavaScript.

Néanmoins, lors de la création de procédures stockées et d'autres objets côté serveur, il est recommandé de nommer les fonctions JavaScript et que ces noms de fonction correspondent à l'ID que nous avons défini dans la définition de DocumentDB.

Step 9 - Appeler CreateStoredProcedureAsync, passant dans le SelfLink pour le MyCollectioncollection et la définition de procédure stockée. Cela crée la procédure stockée etResourceId que DocumentDB lui a attribué.

Step 10 - Appelez la procédure stockée. ExecuteStoredProcedureAsyncprend un paramètre de type que vous définissez sur le type de données attendu de la valeur renvoyée par la procédure stockée, que vous pouvez spécifier simplement en tant qu'objet si vous souhaitez qu'un objet dynamique soit renvoyé. C'est un objet dont les propriétés seront liées au moment de l'exécution.

Dans cet exemple, nous savons que notre procédure stockée renvoie simplement une chaîne et nous appelons donc ExecuteStoredProcedureAsync<string>.

Voici l'implémentation complète du fichier 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); 
         } 
      } 
   } 
}

Lorsque le code ci-dessus est exécuté, il produit la sortie suivante.

Created stored procedure HelloWorldStoreProce (Ic8LAMEUVgACAAAAAAAAgA==)

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

Comme indiqué dans la sortie ci-dessus, la propriété de réponse a le "Bonjour et bienvenue dans DocumentDB!" renvoyé par notre procédure stockée.