このガイドでは、Azure Cosmos DB for MongoDB 仮想コア クラスターに接続する .NET コンソール アプリケーションを構築する方法について説明します。 開発環境を設定し、Azure SDK for .NET の Azure.Identity
ライブラリを使用して認証を行い、データベースと対話してドキュメントを作成、クエリ、更新します。
[前提条件]
- 既存の Azure Cosmos DB for MongoDB (仮想コア) クラスター。
Azure Cloud Shell の Azure CLI の最新バージョン。
- CLI 参照コマンドをローカルで実行する場合は、
az login
コマンドを使用して Azure CLI にサインインします。
- CLI 参照コマンドをローカルで実行する場合は、
クラスター用に構成された Microsoft Entra 認証で、あなたの ID に
dbOwner
ロールが付与されています。- Microsoft Entra 認証を有効にするには、 構成ガイドを確認します。
最新バージョンの .NET。
Microsoft Entra テナントのメタデータを取得する
TokenCredential
の Azure.Identity
クラスを使用してアクセス トークンを取得するために、Microsoft Entra テナントの一意の識別子が必要です。 この前提条件の手順では、Azure CLI を使用して、 tenantId
値を取得して記録します。
az account show
を使用して、現在ログインしている Azure サブスクリプションの詳細を取得します。az account show
このコマンドは、さまざまなフィールドを含む 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" } }
tenantId
プロパティの値を記録します。 このプロパティは、Microsoft Entra テナントの一意の識別子であり、テナント ID と呼ばれることもあります。 この値は、後続のセクションの手順で使用します。
コンソール アプリケーションを構成する
次に、新しいコンソール アプリケーション プロジェクトを作成し、クラスターに対して認証するために必要なライブラリをインポートします。
空のディレクトリに、新しい .NET コンソール アプリケーションを作成します。
dotnet new console
NuGet から
Azure.Identity
パッケージをインポートします。dotnet add package Azure.Identity
次に、
MongoDB.Driver
パッケージをインポートします。dotnet add package MongoDB.Driver
.NET プロジェクトをビルドする
dotnet build
クラスターに接続する
次に、 Azure.Identity
ライブラリを使用して、クラスターへの接続に使用する TokenCredential
を取得します。 公式の MongoDB ドライバーには、クラスターに接続するときに使用するために Microsoft Entra からトークンを取得するために実装する必要がある特別なインターフェイスがあります。
Program.cs ファイルで、これらの
Azure.Identity
およびMongoDB.Driver
名前空間の using ブロックを追加します。using Azure.Identity; using MongoDB.Driver;
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
であることを前提としています。Program.cs ファイルのエディターに戻ります。
既存のクラスターの名前を持つ文字列変数を作成します。 次に、その変数を使用して、次のように
MongoUrl
型の新しいインスタンスを作成します。MongoUrl.Create
string clusterName = "<azure-cosmos-db-mongodb-vcore-cluster-name>"; MongoUrl url = MongoUrl.Create($"mongodb+srv://{clusterName}.global.mongocluster.cosmos.azure.com/");
前の手順で作成した
MongoSettings
と、Azure Cosmos DB for MongoDB 仮想コアの標準的なベスト プラクティス構成を使用して、新しいMongoUrl
インスタンスを構成します。MongoClientSettings settings = MongoClientSettings.FromUrl(url); settings.UseTls = true; settings.RetryWrites = false; settings.MaxConnectionIdleTime = TimeSpan.FromMinutes(2);
種類が
DefaultAzureCredential
の新しい資格情報を作成します。DefaultAzureCredential credential = new();
ヒント
ここでは、任意の種類の資格情報
TokenCredential
使用できます。DefaultAzureCredential
は、初期の開発シナリオで最も摩擦のないオプションです。IOidcCallback
を実装するクラスの新しいインスタンスを作成し、このガイドで前に記録したテナント ID で構成します。string tenantId = "<microsoft-entra-tenant-id>"; AzureIdentityTokenHandler tokenHandler = new(credential, tenantId);
MongoCredential.CreateOidcCredential
を使用して設定の資格情報を構成し、カスタム ハンドラーコールバック実装を渡します。settings.Credential = MongoCredential.CreateOidcCredential(tokenHandler);
設定を固定し、
MongoClient
の新しいインスタンスを作成します。settings.Freeze(); MongoClient client = new(settings); Console.WriteLine("Client created");
一般的な操作を実行する
最後に、公式ライブラリを使用して、データベース、コレクション、ドキュメントで一般的なタスクを実行します。 ここでは、MongoDB または DocumentDB と対話してコレクションと項目を管理する場合と同じクラスとメソッドを使用します。
独自のファイルにカスタム レコードの種類を作成して、ドキュメントを表します。
public record Product( string id, string category, string name, int quantity, decimal price, bool clearance );
ヒント
説明のために、この構造体の名前は
Product
です。 このガイドの残りの部分では、この構造体が既に定義されていることを前提としています。Program.cs ファイルに戻ります。
MongoClient.GetDatabase
を使用してデータベースへのポインターを取得します。string databaseName = "<database-name>"; IMongoDatabase database = client.GetDatabase(databaseName); Console.WriteLine("Database pointer created");
次に、データベース ポインターを使用して、
IMongoDatabase.GetCollection<>
を使用してコレクションへのポインターを取得します。string collectionName = "<collection-name>"; IMongoCollection<Product> collection = database.GetCollection<Product>(collectionName); Console.WriteLine("Collection pointer created");
メソッドを使用して、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}");
IMongoCollection<>.Find
とIFindFluent<,>.SingleAsync
を使用して、コレクションから 1 つのドキュメントを読み取ります。 フィルターを使用して、検索する特定のドキュメントを指定します。Product document = await collection.Find( doc => doc.id == "cccccccc-2222-3333-4444-dddddddddddd" ).SingleAsync(); Console.WriteLine($"Found document:\t{document.name}");
同じ
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}"); }
IMongoCollection<>.DeleteOneAsync
とフィルターを使用して、コレクションから特定のドキュメントを削除します。await collection.DeleteOneAsync( doc => doc.id == "bbbbbbbb-1111-2222-3333-cccccccccccc" ); Console.WriteLine($"Deleted document");
プロジェクト内のすべてのコード ファイルを保存します。
を使用してプロジェクトを実行する
dotnet run
dotnet run
実行中のアプリケーションからの出力を確認します。
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