Azure Cosmos DB for NoSQL SDK を使用して複数のポイント操作をまとめてバッチ処理する

TransactionalBatch および TransactionalBatchResponse クラスをまとめると、操作を構成し、1 つの論理ステップに分解するための鍵となります。 これらのクラスを使用すると、複数の操作を実行するコードを記述し、サーバー側で正常に完了したかどうかを判断できます。

このラボでは、SDK を使用して、2 つの項目を 1 つの論理ユニットとして作成しようとする 2 つのデュアル項目操作を実行します。

開発環境を準備する

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

  1. 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 アカウントを作成し、SDK プロジェクトを構成する

  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 に戻ります。

  8. [エクスプローラー] ウィンドウで、07-sdk-batch フォルダーを参照します。

  9. 07-sdk-batch フォルダー内の script.cs コード ファイルを開きます。

    📝 Microsoft.Azure.Cosmos ライブラリは、既に NuGet から事前にインポートされています。

  10. endpoint という名前の string 変数を見つけます。 その値を、先ほど作成した Azure Cosmos DB アカウントのエンドポイントに設定します。

     string endpoint = "<cosmos-endpoint>";
    

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

  11. key という名前の string 変数を見つけます。 その値を、先ほど作成した Azure Cosmos DB アカウントのキーに設定します。

     string key = "<cosmos-key>";
    

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

  12. script.cs コード ファイルを保存します。

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

    📝 このコマンドを実行すると、開始ディレクトリが 07-sdk-batch フォルダーに既に設定されているターミナルが開きます。

  14. 次のコマンドを使用して、NuGet から Microsoft.Azure.Cosmos パッケージを追加します。

     dotnet add package Microsoft.Azure.Cosmos --version 3.22.1
    
  15. dotnet build コマンドを使用してプロジェクトをビルドします。

     dotnet build
    
  16. 統合ターミナルを閉じます。

トランザクション バッチの作成

まず、2 つの架空の製品を作成する単純なトランザクション バッチを作成しましょう。 このバッチでは、同じ “used accessories” カテゴリ識別子を持つコンテナーに、worn saddle と rusty handlebar を挿入します。 どちらの項目にも同じ論理パーティション キーがあります。これにより、確実にバッチ操作が成功します。

  1. script.cs コード ファイルのエディター タブに戻ります。

  2. 一意識別子が 0120、名前が Worn Saddle、およびカテゴリ識別子が 9603ca6c-9e28-4a02-9194-51cdb7fea816saddle という名前の Product 変数を作成します。

     Product saddle = new("0120", "Worn Saddle", "9603ca6c-9e28-4a02-9194-51cdb7fea816");
    
  3. 一意識別子が 012A、名前が Rusty Handlebar、およびカテゴリ識別子が 9603ca6c-9e28-4a02-9194-51cdb7fea816handlebar という名前の Product 変数を作成します。

     Product handlebar = new("012A", "Rusty Handlebar", "9603ca6c-9e28-4a02-9194-51cdb7fea816");
    
  4. コンストラクター パラメーターとして 9603ca6c-9e28-4a02-9194-51cdb7fea816 を渡す partitionKey という名前の PartitionKey 型の変数を作成します。

     PartitionKey partitionKey = new ("9603ca6c-9e28-4a02-9194-51cdb7fea816");
    
  5. メソッド パラメーターとして partitionkey 変数を渡す container 変数の CreateTransactionalBatch メソッドを呼び出し、fluent 構文を使用して、個々の操作で作成する項目として saddle および handlebar 変数を渡す CreateItem<> ジェネリック メソッドを呼び出し、結果を TransactionalBatch 型の batch という名前の変数に格納します。

     TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey)
         .CreateItem<Product>(saddle)
         .CreateItem<Product>(handlebar);
    
  6. using ステートメント内で、batch 変数の ExecuteAsync メソッドを非同期的に呼び出し、結果を response という名前の TransactionalBatchResponse 型の変数に格納します。

     using TransactionalBatchResponse response = await batch.ExecuteAsync();
    
  7. 静的 Console.WriteLine メソッドを呼び出して、response 変数の StatusCode プロパティの値を出力します。

     Console.WriteLine($"Status:\t{response.StatusCode}");
    
  8. 完了すると、コード ファイルが次のようになるはずです。

     using System;
     using Microsoft.Azure.Cosmos;
        
     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", 400);
    
     Product saddle = new("0120", "Worn Saddle", "9603ca6c-9e28-4a02-9194-51cdb7fea816");
     Product handlebar = new("012A", "Rusty Handlebar", "9603ca6c-9e28-4a02-9194-51cdb7fea816");
        
     PartitionKey partitionKey = new ("9603ca6c-9e28-4a02-9194-51cdb7fea816");
        
     TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey)
         .CreateItem<Product>(saddle)
         .CreateItem<Product>(handlebar);
        
     using TransactionalBatchResponse response = await batch.ExecuteAsync();
        
     Console.WriteLine($"Status:\t{response.StatusCode}");
    
  9. script.cs コード ファイルを保存します。

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

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

     dotnet run
    
  12. ターミナルからの出力を確認します。 状態コードは OK になるはずです。

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

誤ったトランザクション バッチの作成

次は、意図的にエラーを発生させるトランザクション バッチを作成しましょう。 このバッチでは、異なる論理パーティション キーを持つ 2 つの項目の挿入が試行されます。 “used accessories” カテゴリには flickering strobe light を、”pristine accessories” カテゴリには new helmet を作成します。 定義上、これは誤った要求であり、このトランザクションを実行するとエラーが返されるはずです。

  1. script.cs コード ファイルのエディター タブに戻ります。

  2. 次のコード行を削除します。

     Product saddle = new("0120", "Worn Saddle", "9603ca6c-9e28-4a02-9194-51cdb7fea816");
     Product handlebar = new("012A", "Rusty Handlebar", "9603ca6c-9e28-4a02-9194-51cdb7fea816");
        
     PartitionKey partitionKey = new ("9603ca6c-9e28-4a02-9194-51cdb7fea816");
        
     TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey)
         .CreateItem<Product>(saddle)
         .CreateItem<Product>(handlebar);
        
     using TransactionalBatchResponse response = await batch.ExecuteAsync();
        
     Console.WriteLine($"Status:\t{response.StatusCode}");
    
  3. 一意識別子が 012B、名前が Flickering Strobe Light、およびカテゴリ識別子が 9603ca6c-9e28-4a02-9194-51cdb7fea816light という名前の Product 変数を作成します。

     Product light = new("012B", "Flickering Strobe Light", "9603ca6c-9e28-4a02-9194-51cdb7fea816");
    
  4. 一意識別子が 012C、名前が New Helmet、およびカテゴリ識別子が 0feee2e4-687a-4d69-b64e-be36afc33e74helmet という名前の Product 変数を作成します。

     Product helmet = new("012C", "New Helmet", "0feee2e4-687a-4d69-b64e-be36afc33e74");
    
  5. コンストラクター パラメーターとして 9603ca6c-9e28-4a02-9194-51cdb7fea816 を渡す partitionKey という名前の PartitionKey 型の変数を作成します。

     PartitionKey partitionKey = new ("9603ca6c-9e28-4a02-9194-51cdb7fea816");
    
  6. メソッド パラメーターとして partitionkey 変数を渡す container 変数の CreateTransactionalBatch メソッドを呼び出し、fluent 構文を使用して、個々の操作で作成する項目として light および helmet 変数を渡す CreateItem<> ジェネリック メソッドを呼び出し、結果を TransactionalBatch 型の batch という名前の変数に格納します。

     TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey)
         .CreateItem<Product>(light)
         .CreateItem<Product>(helmet);
    
  7. using ステートメント内で、batch 変数の ExecuteAsync メソッドを非同期的に呼び出し、結果を response という名前の TransactionalBatchResponse 型の変数に格納します。

     using TransactionalBatchResponse response = await batch.ExecuteAsync();
    
  8. 静的 Console.WriteLine メソッドを呼び出して、response 変数の StatusCode プロパティの値を出力します。

     Console.WriteLine($"Status:\t{response.StatusCode}");
    
  9. 完了すると、コード ファイルが次のようになるはずです。

     using System;
     using Microsoft.Azure.Cosmos;
        
     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", 400);
    
     Product light = new("012B", "Flickering Strobe Light", "9603ca6c-9e28-4a02-9194-51cdb7fea816");
     Product helmet = new("012C", "New Helmet", "0feee2e4-687a-4d69-b64e-be36afc33e74");
        
     PartitionKey partitionKey = new ("9603ca6c-9e28-4a02-9194-51cdb7fea816");
        
     TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey)
         .CreateItem<Product>(light)
         .CreateItem<Product>(helmet);
        
     using TransactionalBatchResponse response = await batch.ExecuteAsync();
        
     Console.WriteLine($"Status:\t{response.StatusCode}");
    
  10. script.cs コード ファイルを保存します。

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

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

     dotnet run
    
  13. ターミナルからの出力を確認します。 状態コードは正しくない要求または競合のいずれかになるはずです。 これは、トランザクション内のすべての項目で、トランザクション バッチと同じパーティション キー値が共有されなかったため発生しました。

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

  15. Visual Studio Code を閉じます。