Documentdb-sql-javascript-integration

提供:Dev Guides
移動先:案内検索

DocumentDB SQL-JavaScript統合

最近では、JavaScriptはブラウザだけでなくどこにでもあります。 DocumentDBは、JavaScriptを現代のT-SQLの一種として受け入れ、データベースエンジン内でJavaScriptロジックのネイティブなトランザクション実行をサポートします。 DocumentDBは、ストアドプロシージャとトリガーに関して、コレクション上でJavaScriptベースのアプリケーションロジックを直接実行するためのプログラミングモデルを提供します。

簡単なストアプロシージャを作成する例を見てみましょう。 手順は次のとおりです-

  • ステップ1 *-新しいコンソールアプリケーションを作成します。
  • ステップ2 *-NuGetから.NET SDKに追加します。 ここでは.NET SDKを使用しています。つまり、ストアドプロシージャを作成、実行、および削除するためのC#コードを記述しますが、ストアドプロシージャ自体はJavaScriptで記述されます。
  • ステップ3 *-ソリューションエクスプローラーでプロジェクトを右クリックします。
  • ステップ4 *-ストアドプロシージャ用の新しいJavaScriptファイルを追加し、HelloWorldStoreProce.jsを呼び出します

JavaScriptストアドプロシージャ

すべてのストアドプロシージャはJavaScript関数であるため、新しい関数を作成し、当然この関数に HelloWorldStoreProce という名前を付けます。 関数に名前を付けてもかまいません。 DocumentDBは、このストアドプロシージャを、作成時に指定したIDによってのみ参照します。

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

ストアドプロシージャは、コンテキストから応答オブジェクトを取得し、その setBody メソッドを呼び出して呼び出し元に文字列を返すだけです。 C#コードでは、ストアドプロシージャを作成し、実行してから削除します。

ストアドプロシージャはコレクションごとにスコープされるため、ストアドプロシージャを作成するにはコレクションのSelfLinkが必要です。

ステップ5 *-最初に *myfirstdb データベースを照会し、次に MyCollection コレクションを照会します。

ストアドプロシージャの作成は、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);
   }
}

ステップ6 *-最初に新しいリソースのIDで定義オブジェクトを作成し、次に *DocumentClient オブジェクトでCreateメソッドの1つを呼び出します。 ストアドプロシージャの場合、定義にはIdとサーバーに送信する実際のJavaScriptコードが含まれます。

ステップ7 *- *File.ReadAllText を呼び出して、JSファイルからストアドプロシージャコードを抽出します。

  • ステップ8 *-ストアドプロシージャコードを定義オブジェクトのbodyプロパティに割り当てます。

DocumentDBに関する限り、ここで定義で指定するIdは、実際にJavaScript関数に名前を付けるかどうかに関係なく、ストアドプロシージャの名前です。

それでも、ストアドプロシージャやその他のサーバー側オブジェクトを作成するときは、JavaScript関数に名前を付け、それらの関数名がDocumentDBの定義で設定したIDと一致することをお勧めします。

ステップ9 *- *CreateStoredProcedureAsync を呼び出し、 MyCollection コレクションとストアドプロシージャ定義の SelfLink を渡します。 これにより、DocumentDBが割り当てたストアドプロシージャと ResourceId が作成されます。

ステップ10 *-ストアドプロシージャを呼び出します。 *ExecuteStoredProcedureAsync は、ストアドプロシージャによって返される値の予期されるデータ型に設定する型パラメーターを取ります。動的パラメーターを返す場合は、オブジェクトとして単純に指定できます。 これは、実行時にプロパティがバインドされるオブジェクトです。

この例では、ストアドプロシージャが文字列を返しているだけであるため、 ExecuteStoredProcedureAsync <string> を呼び出します。

以下は、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);
         }
      }
   }
}

上記のコードが実行されると、次の出力が生成されます。

Created stored procedure HelloWorldStoreProce (Ic8LAMEUVgACAAAAAAAAgA==)

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

上記の出力に見られるように、応答プロパティには、ストアドプロシージャによって返された「Hello、and welcome to DocumentDB!」があります。