次の方法で共有


Azure Cosmos DB for MongoDB 仮想コアを使用して .NET コンソール アプリを構築する

このガイドでは、Azure Cosmos DB for MongoDB 仮想コア クラスターに接続する .NET コンソール アプリケーションを構築する方法について説明します。 開発環境を設定し、Azure SDK for .NET の Azure.Identity ライブラリを使用して認証を行い、データベースと対話してドキュメントを作成、クエリ、更新します。

[前提条件]

  • 既存の Azure Cosmos DB for MongoDB (仮想コア) クラスター。
  • Azure Cloud ShellAzure CLI の最新バージョン。

    • CLI 参照コマンドをローカルで実行する場合は、 az login コマンドを使用して Azure CLI にサインインします。
  • クラスター用に構成された Microsoft Entra 認証で、あなたの ID に dbOwner ロールが付与されています。

  • 最新バージョンの .NET

Microsoft Entra テナントのメタデータを取得する

TokenCredentialAzure.Identity クラスを使用してアクセス トークンを取得するために、Microsoft Entra テナントの一意の識別子が必要です。 この前提条件の手順では、Azure CLI を使用して、 tenantId 値を取得して記録します。

  1. az account showを使用して、現在ログインしている Azure サブスクリプションの詳細を取得します。

    az account show
    
  2. このコマンドは、さまざまなフィールドを含む JSON 応答を出力します。

    {
      "environmentName": "AzureCloud",
      "homeTenantId": "eeeeffff-4444-aaaa-5555-bbbb6666cccc",
      "id": "dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b",
      "isDefault": true,
      "managedByTenants": [],
      "name": "example-azure-subscription",
      "state": "Enabled",
      "tenantId": "eeeeffff-4444-aaaa-5555-bbbb6666cccc",
      "user": {
        "cloudShellID": true,
        "name": "kai@adventure-works.com",
        "type": "user"
      }
    }
    
  3. tenantId プロパティの値を記録します。 このプロパティは、Microsoft Entra テナントの一意の識別子であり、テナント ID と呼ばれることもあります。 この値は、後続のセクションの手順で使用します。

コンソール アプリケーションを構成する

次に、新しいコンソール アプリケーション プロジェクトを作成し、クラスターに対して認証するために必要なライブラリをインポートします。

  1. 空のディレクトリに、新しい .NET コンソール アプリケーションを作成します。

    dotnet new console
    
  2. NuGet から Azure.Identity パッケージをインポートします。

    dotnet add package Azure.Identity
    
  3. 次に、 MongoDB.Driver パッケージをインポートします。

    dotnet add package MongoDB.Driver
    
  4. .NET プロジェクトをビルドする

    dotnet build
    

クラスターに接続する

次に、 Azure.Identity ライブラリを使用して、クラスターへの接続に使用する TokenCredential を取得します。 公式の MongoDB ドライバーには、クラスターに接続するときに使用するために Microsoft Entra からトークンを取得するために実装する必要がある特別なインターフェイスがあります。

  1. Program.cs ファイルで、これらのAzure.IdentityおよびMongoDB.Driver名前空間の using ブロックを追加します。

    using Azure.Identity;
    using MongoDB.Driver;
    
  2. MongoDB.Driver.Authentication.Oidc.IOidcCallback インターフェイスのすべての必須メンバーを実装する別のファイルに新しいクラスを作成します。

    using Azure.Core;
    using MongoDB.Driver.Authentication.Oidc;
    
    internal sealed class AzureIdentityTokenHandler(
        TokenCredential credential,
        string tenantId
    ) : IOidcCallback
    {
        private readonly string[] scopes = ["https://ossrdbms-aad.database.windows.net/.default"];
    
        public OidcAccessToken GetOidcAccessToken(OidcCallbackParameters parameters, CancellationToken cancellationToken)
        {
            AccessToken token = credential.GetToken(
                new TokenRequestContext(scopes, tenantId: tenantId),
                cancellationToken
            );
    
            return new OidcAccessToken(token.Token, token.ExpiresOn - DateTimeOffset.UtcNow);
        }
    
        public async Task<OidcAccessToken> GetOidcAccessTokenAsync(OidcCallbackParameters parameters, CancellationToken cancellationToken)
        {
            AccessToken token = await credential.GetTokenAsync(
                new TokenRequestContext(scopes, parentRequestId: null, tenantId: tenantId),
                cancellationToken
            );
    
            return new OidcAccessToken(token.Token, token.ExpiresOn - DateTimeOffset.UtcNow);
        }
    }
    

    ヒント

    説明のために、このクラスの名前は AzureIdentityTokenHandler です。 このクラスには任意の名前を付けることができます。 このガイドの残りの部分では、クラスの名前が AzureIdentityTokenHandler であることを前提としています。

  3. Program.cs ファイルのエディターに戻ります。

  4. 既存のクラスターの名前を持つ文字列変数を作成します。 次に、その変数を使用して、次のように MongoUrl 型の新しいインスタンスを作成します。 MongoUrl.Create

    string clusterName = "<azure-cosmos-db-mongodb-vcore-cluster-name>";
    
    MongoUrl url = MongoUrl.Create($"mongodb+srv://{clusterName}.global.mongocluster.cosmos.azure.com/");
    
  5. 前の手順で作成したMongoSettingsと、Azure Cosmos DB for MongoDB 仮想コアの標準的なベスト プラクティス構成を使用して、新しいMongoUrl インスタンスを構成します。

    MongoClientSettings settings = MongoClientSettings.FromUrl(url);
    
    settings.UseTls = true;
    settings.RetryWrites = false;
    settings.MaxConnectionIdleTime = TimeSpan.FromMinutes(2);
    
  6. 種類が DefaultAzureCredential の新しい資格情報を作成します。

    DefaultAzureCredential credential = new();
    

    ヒント

    ここでは、任意の種類の資格情報 TokenCredential 使用できます。 DefaultAzureCredential は、初期の開発シナリオで最も摩擦のないオプションです。

  7. IOidcCallbackを実装するクラスの新しいインスタンスを作成し、このガイドで前に記録したテナント ID で構成します。

    string tenantId = "<microsoft-entra-tenant-id>";
    
    AzureIdentityTokenHandler tokenHandler = new(credential, tenantId);
    
  8. MongoCredential.CreateOidcCredentialを使用して設定の資格情報を構成し、カスタム ハンドラーコールバック実装を渡します。

    settings.Credential = MongoCredential.CreateOidcCredential(tokenHandler);
    
  9. 設定を固定し、 MongoClientの新しいインスタンスを作成します。

    settings.Freeze();
    
    MongoClient client = new(settings);
    
    Console.WriteLine("Client created");
    

一般的な操作を実行する

最後に、公式ライブラリを使用して、データベース、コレクション、ドキュメントで一般的なタスクを実行します。 ここでは、MongoDB または DocumentDB と対話してコレクションと項目を管理する場合と同じクラスとメソッドを使用します。

  1. 独自のファイルにカスタム レコードの種類を作成して、ドキュメントを表します。

    public record Product(
        string id,
        string category,
        string name,
        int quantity,
        decimal price,
        bool clearance
    );
    

    ヒント

    説明のために、この構造体の名前は Product です。 このガイドの残りの部分では、この構造体が既に定義されていることを前提としています。

  2. Program.cs ファイルに戻ります。

  3. MongoClient.GetDatabaseを使用してデータベースへのポインターを取得します。

    string databaseName = "<database-name>";
    
    IMongoDatabase database = client.GetDatabase(databaseName);
    
    Console.WriteLine("Database pointer created"); 
    
  4. 次に、データベース ポインターを使用して、 IMongoDatabase.GetCollection<>を使用してコレクションへのポインターを取得します。

    string collectionName = "<collection-name>";
    
    IMongoCollection<Product> collection = database.GetCollection<Product>(collectionName);
    
    Console.WriteLine("Collection pointer created"); 
    
  5. メソッドを使用して、2 つのドキュメントを作成してIMongoCollection<>.ReplaceOneAsyncします。

    Product classicSurfboard = new(
        id: "bbbbbbbb-1111-2222-3333-cccccccccccc",
        category: "gear-surf-surfboards",
        name: "Kiama Classic Surfboard",
        quantity: 25,
        price: 790.00m,
        clearance: false
    );
    
    Product paddleKayak = new(
        id: "cccccccc-2222-3333-4444-dddddddddddd",
        category: "gear-paddle-kayaks",
        name: "Lastovichka Paddle Kayak",
        quantity: 10,
        price: 599.99m,
        clearance: true
    );
    
    await collection.ReplaceOneAsync<Product>(
        doc => doc.id == classicSurfboard.id,
        classicSurfboard,
        new ReplaceOptions { IsUpsert = true }
    );
    
    Console.WriteLine($"Upserted document:\t{classicSurfboard.id}");
    
    await collection.ReplaceOneAsync<Product>(
        doc => doc.id == paddleKayak.id,
        paddleKayak,
        new ReplaceOptions { IsUpsert = true }
    );
    
    Console.WriteLine($"Upserted document:\t{paddleKayak.id}");
    
  6. IMongoCollection<>.FindIFindFluent<,>.SingleAsyncを使用して、コレクションから 1 つのドキュメントを読み取ります。 フィルターを使用して、検索する特定のドキュメントを指定します。

    Product document = await collection.Find(
        doc => doc.id == "cccccccc-2222-3333-4444-dddddddddddd"
    ).SingleAsync();
    
    Console.WriteLine($"Found document:\t{document.name}");
    
  7. 同じ Find メソッドを使用して、フィルターに一致するすべてのドキュメントを照会します。 フィルターを使用して、特定のプロパティ ( category など) と特定の値 ( gear-surf-surfboards など) を定義します。 IFindFluent<,>.ToListAsyncを使用して結果を列挙します。

    List<Product> documents = await collection.Find(
        doc => doc.category == "gear-surf-surfboards"
    ).ToListAsync();
    
    foreach (Product doc in documents)
    {
        Console.WriteLine($"Queried document:\t{doc}");
    }
    
  8. IMongoCollection<>.DeleteOneAsyncとフィルターを使用して、コレクションから特定のドキュメントを削除します。

    await collection.DeleteOneAsync(
        doc => doc.id == "bbbbbbbb-1111-2222-3333-cccccccccccc"
    );
    
    Console.WriteLine($"Deleted document");
    
  9. プロジェクト内のすべてのコード ファイルを保存します

  10. を使用してプロジェクトを実行する dotnet run

    dotnet run
    
  11. 実行中のアプリケーションからの出力を確認します。

    Client created
    Database pointer created
    Collection pointer created
    Upserted document:      bbbbbbbb-1111-2222-3333-cccccccccccc
    Upserted document:      cccccccc-2222-3333-4444-dddddddddddd
    Found document: Lastovichka Paddle Kayak
    Queried document:       Product { id = bbbbbbbb-1111-2222-3333-cccccccccccc, category = gear-surf-surfboards, name = Kiama Classic Surfboard, quantity = 25, price = 790.00, clearance = False }
    Deleted document