SDK を使ってユーザー定義関数を実装してから使用する

Azure Cosmos DB for NoSQL 用の .NET SDK 使用して、コンテナーから直接サーバー側のプログラミング コンストラクトを管理し、呼び出すことができます。 新しいコンテナーを準備する際、データ エクスプローラーを使用して手動でタスクを実行する代わりに、.NET SDK を使用して UDF をコンテナーに直接発行する方が理にかなっている場合があります。

このラボでは、.NET SDK を使用して新しい UDF を作成し、データ エクスプローラーを使用して UDF が正常に機能していることを検証します。

開発環境を準備する

このラボで作業している環境に DP-420 のラボ コードのリポジトリをまだクローンしていない場合は、次の手順に従ってクローンします。 それ以外の場合は、以前にクローンしたフォルダーを Visual Studio Code で開きます。

  1. Visual Studio Code を起動します。

    📝 Visual Studio Code インターフェイスについてまだよく理解していない場合は、Visual Studio Code の入門ガイドを参照してください

  2. コマンド パレットを開き、Git: Clone を実行して、任意のローカル フォルダーに https://github.com/microsoftlearning/dp-420-cosmos-db-dev GitHub リポジトリをクローンします。

    💡 Ctrl + Shift + P キーボード ショートカットを使用してコマンド パレットを開くことができます。

  3. リポジトリが複製されたら、Visual Studio Code で選択したローカル フォルダーを開きます。

Azure Cosmos DB for NoSQL アカウントを作成する

Azure Cosmos DB は、複数の API をサポートするクラウドベースの NoSQL データベース サービスです。 Azure Cosmos DB アカウントを初めてプロビジョニングするときに、そのアカウントでサポートする API (たとえば、Mongo APINoSQL API) を選択します。 Azure Cosmos DB for NoSQL アカウントのプロビジョニングが完了したら、エンドポイントとキーを取得し、Azure SDK for .NET または任意の他の SDK を使用して Azure Cosmos DB for NoSQL アカウントに接続する際に使用できます。

  1. 新しい Web ブラウザー ウィンドウまたはタブで、Azure portal (portal.azure.com) に移動します。

  2. ご利用のサブスクリプションに関連付けられている Microsoft 資格情報を使用して、ポータルにサインインします。

  3. [+ リソースの作成] を選択し、Cosmos DB を検索して、新しい Azure Cosmos DB for NoSQL アカウント リソースを作成します。以下を設定して、残りの設定はすべて既定値のままにします。

    設定 Value
    サブスクリプション ’‘既存の Azure サブスクリプション’’
    リソース グループ ’‘既存のリソース グループを選択するか、新しいものを作成します’’
    アカウント名 ’‘グローバルに一意の名前を入力します’’
    場所 ’‘使用可能なリージョンを選びます’’
    容量モード プロビジョニング済みスループット
    Apply Free Tier Discount (Free レベル割引の適用) 適用しない

    📝 ご利用のラボ環境には、新しいリソース グループを作成できない制限が存在する場合があります。 その場合は、事前に作成されている既存のリソース グループを使用します。

  4. デプロイ タスクが完了するまで待ってから、このタスクを続行してください。

  5. 新しく作成された Azure Cosmos DB アカウント リソースに移動し、 [キー] ペインに移動します。

  6. このペインには、SDK からアカウントに接続するために必要な接続の詳細と資格情報が含まれています。 具体的な内容は次のとおりです。

    1. [URI] フィールドに注目します。 このエンドポイントの値は、この演習で後ほど使用します。

    2. [主キー] フィールドに注目してください。 このキーの値は、この演習で後ほど使用します。

  7. ブラウザー ウィンドウを閉じずに、Visual Studio Code を開きます。

Azure Cosmos DB for NoSQL アカウントにデータをシードする

cosmicworks コマンドライン ツールを使用して、Azure Cosmos DB for NoSQL アカウントにサンプル データをデプロイします。 このツールはオープンソースで、NuGet から入手できます。 このツールを Azure Cloud Shell にインストールして、データベースのシードに使用します。

  1. Visual Studio Code で、 [ターミナル] メニューを開き、 [新しいターミナル] を選択して新しいターミナル インスタンスを開きます。

  2. コンピューターでグローバルに使用するために cosmicworks コマンドライン ツールをインストールします。

     dotnet tool install cosmicworks --global --version 1.*
    

    💡 このコマンドが完了するまで数分かかる場合があります。 過去にこのツールの最新バージョンを既にインストールしている場合は、このコマンドによって警告メッセージ (*ツール ‘cosmicworks’ は既にインストールされています) が出力されます。

  3. cosmicworks を実行し、次のコマンドライン オプションを使用して Azure Cosmos DB アカウントをシードします。

    オプション Value
    –endpoint ’‘このラボで先ほどコピーしたエンドポイントの値’’
    –key ’‘このラボで先ほどコピーしたキーの値’’
    –datasets product
     cosmicworks --endpoint <cosmos-endpoint> --key <cosmos-key> --datasets product
    

    📝 たとえば、エンドポイントが https­://dp420.documents.azure.com:443/ で、キーが fDR2ci9QgkdkvERTQ== の場合、コマンドは次のようになります。cosmicworks --endpoint https://dp420.documents.azure.com:443/ --key fDR2ci9QgkdkvERTQ== --datasets product

  4. cosmicworks コマンドによって、データベース、コンテナー、および項目がアカウントに設定されるまで待ちます。

  5. 統合ターミナルを閉じます。

.NET SDK を使用してユーザー定義関数 (UDF) を作成する

.NET SDK の Container クラスには、SDK から直接ストアド プロシージャ、UDF、およびトリガーに対して CRUD 操作を実行するために使用する Scripts プロパティが用意されています。 このプロパティを使用して、新しい UDF を作成し、その UDF を Azure Cosmos DB for NoSQL コンテナーにプッシュします。 UDF を SDK を使用して作成すると、製品の税込み価格が計算され、税込み価格を使用して製品で SQL クエリを実行できるようになります。

  1. Visual Studio Code[エクスプローラー] ペインで、33-create-use-udf-sdk フォルダーを参照します。

  2. script.cs コード ファイルを開きます。

  3. Microsoft.Azure.Cosmos.Scripts 名前空間の using ブロックを追加します。

     using Microsoft.Azure.Cosmos.Scripts;
    
  4. endpoint という名前の既存の変数を、先ほど作成した Azure Cosmos DB アカウントの endpoint に設定された値で更新します。

     string endpoint = "<cosmos-endpoint>";
    

    📝 たとえば、ご自分のエンドポイントが https­://dp420.documents.azure.com:443/ の場合、C# ステートメントは string endpoint = “https­://dp420.documents.azure.com:443/”; になります。

  5. key という名前の既存の変数を、先ほど作成した Azure Cosmos DB アカウントの key に設定された値で更新します。

     string key = "<cosmos-key>";
    

    📝 たとえば、キーが fDR2ci9QgkdkvERTQ== の場合、C# ステートメントは string key = “fDR2ci9QgkdkvERTQ==”; になります。

  6. 既定の空のコンストラクターを使用して、props という名前の UserDefinedFunctionProperties 型の新しい変数を作成します。

     UserDefinedFunctionProperties props = new ();
    
  7. props 変数の Id プロパティを tax の値に設定します。

     props.Id = "tax";
    
  8. props 変数の Body プロパティを props.Body = “function tax(i) { return i * 1.25; }”; に設定します。

     props.Body = "function tax(i) { return i * 1.25; }";
    
  9. パラメーターとして props 変数を渡して、container 変数の Scripts.CreateUserDefinedFunctionAsync メソッドを非同期に呼び出し、結果を UserDefinedFunctionResponse 型の udf という名前の変数に保存します。

     UserDefinedFunctionResponse udf = await container.Scripts.CreateUserDefinedFunctionAsync(props);
    
  10. 組み込みの Console.WriteLine 静的メソッドを使用して、Created UDF というタイトルのヘッダーを持つ UserDefinedFunctionResponse クラスの Resource.Id プロパティを出力します。

     Console.WriteLine($"Created UDF [{udf.Resource?.Id}]");
    
  11. 完了すると、コード ファイルが次のようになるはずです。

     using System;
     using Microsoft.Azure.Cosmos;
     using Microsoft.Azure.Cosmos.Scripts;
    
     string endpoint = "<cosmos-endpoint>";
    
     string key = "<cosmos-key>";
    
     CosmosClient client = new CosmosClient(endpoint, key);
    
     Database database = await client.CreateDatabaseIfNotExistsAsync("cosmicworks");
    
     Container container = await database.CreateContainerIfNotExistsAsync("products", "/categoryId");
    
     UserDefinedFunctionProperties props = new ();
     props.Id = "tax";
     props.Body = "function tax(i) { return i * 1.25; }";
        
     UserDefinedFunctionResponse udf = await container.Scripts.CreateUserDefinedFunctionAsync(props);
        
     Console.WriteLine($"Created UDF [{udf.Resource?.Id}]");
    
  12. script.cs ファイルを保存します。

  13. Visual Studio Code で、33-create-use-udf-sdk フォルダーのコンテキスト メニューを開き、[統合ターミナルで開く] を選択して新しいターミナル インスタンスを開きます。

  14. dotnet run コマンドを使用して、プロジェクトをビルドして実行します。

     dotnet run
    
  15. スクリプトにより、新しく作成した UDF の名前が出力されます。

     Created UDF [tax]
    
  16. 統合ターミナルを閉じます。

  17. Visual Studio Code を閉じます。

データ エクスプローラーを使用して UDF をテストする

Azure Cosmos DB コンテナーに新しい UDF を作成したので、データ エクスプローラーを使用して UDF が想定どおりに動作していることを検証します。

  1. Web ブラウザーに戻ります。

  2. Azure Cosmos DB アカウント リソース内で、 [データ エクスプローラー] ペインに移動します。

  3. [データ エクスプローラー] で、cosmicworks データベース ノードを展開し、NoSQL API ナビゲーション ツリー内の新しい products コンテナー ノードを確認します。

  4. NoSQL API ナビゲーション ツリー内の products コンテナー ノードを選択し、[新しい SQL クエリ] を選択します。

  5. [クエリ] タブで、[クエリの実行] を選択して、フィルターなしですべての項目を選択する標準クエリを表示します。

  6. エディター領域のコンテンツを削除します。

  7. 2 つの価格値が射影されたすべてのドキュメントを返す新しい SQL クエリを作成します。 最初の値はコンテナーからの生の価格値で、2 番目の値は UDF によって計算された価格値です。

     SELECT p.id, p.price, udf.tax(p.price) AS priceWithTax FROM products p
    
  8. [クエリの実行] を選択します。

  9. ドキュメントを確認し、それらの pricepriceWithTax のフィールドを比較します。

    📝 priceWithTax フィールドには、price フィールドよりも 25% 大きい値が含まれているはずです。

  10. Web ブラウザーのウィンドウまたはタブを閉じます。