チュートリアル: .NET/ C#ドライバーを使用して RESTットフルAPIを作成する
Overview
このチュートリアルでは、 MongoDB Atlasクラスター内のコレクション全体で基本的な作成、読み取り、アップデート、削除( CRUD )操作を実行するエンドポイントを使用して RESTless APIを作成する方法を学びます。
前提条件
このチュートリアルを開始する前に、次のアクションを実行してください。
MongoDB Atlasアカウントを設定し、M0 以上のクラスターを配置して構成します。手順を表示するには、「Atlas を使い始める」ガイドを参照してください。
マシンに.NET 6.0 以降をインストールします。.NETをインストールするには、Microsoft .NETダウンロード ページ にアクセスします。
注意
言語互換性
このチュートリアルでは.NET Core 8.0 を使用していますが、 .NET 6.0 以降の任意のバージョンを使用できます。
プロジェクトを設定する
ターミナルで次のコマンドを実行して、ウェブアプリケーションテンプレートを使用する新しい.NET Coreプロジェクトを作成します。
dotnet new webapi -o MongoExample cd MongoExample
.NET/ C#ドライバーを依存関係としてプロジェクトに追加するには、次のコマンドを実行します。
dotnet add package MongoDB.Driver
上記のコマンドでは、MongoExample
という名前の.NET Core 用の新しいウェブアプリケーションプロジェクトを作成し、最新の.NET/ C#ドライバーをインストールします。テンプレートプロジェクトには、 REST有効APIを実装するために変更するいくつかの定型ファイルが含まれています。
ドキュメントモデルとデータベースサービスの設計
このセクションでは、 MongoDBサービスを作成および構成し、 RESTflu APIのデータモデルを定義できます。
MongoDBSettingsクラスを作成する
MongoDBサービスは、接続を確立し、 MongoDB内のドキュメントを直接操作する役割を果たします。プロジェクトに、Models
という名前のフォルダを作成します。Models
フォルダーに MongoDBSettings.cs
という名前の新しいファイルを作成します。このファイルに、次のコードを追加します。
namespace MongoExample.Models; public class MongoDBSettings { public string ConnectionURI { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string CollectionName { get; set; } = null!; }
上記のコードでは、接続、データベース名、コレクション名に関する情報を含む MongoDBSettings
という名前のクラスが定義されます。
appsettings.jsonファイルを更新します
プロジェクトの appsettings.json
ファイル内の MongoDBSettings
クラスで定義されたクラスフィールドに保存されているデータを見つけることができます。このファイルを開き、次の構成を追加します。
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "MongoDB": { "ConnectionURI": "<Atlas connection string>", "DatabaseName": "sample_mflix", "CollectionName": "playlist" } }
このチュートリアルでは、 sample_mflix
データベースと playlist
コレクションを使用します。<Atlas connection string>
プレースホルダーをMongoDB Atlas接続文字列に置き換えます。 接続文字列を見つける方法の詳細については、Atlas ドキュメントの「 クラスターへの接続 」チュートリアルを参照してください。
サービスを作成する
プロジェクトに、Services
という名前のフォルダを作成します。Services
フォルダーに MongoDBService.cs
という名前の新しいファイルを作成し、次のコードを追加します。
using MongoExample.Models; using Microsoft.Extensions.Options; using MongoDB.Driver; using MongoDB.Bson; namespace MongoExample.Services; public class MongoDBService { private readonly IMongoCollection<Playlist> _playlistCollection; public MongoDBService(IOptions<MongoDBSettings> mongoDBSettings) { MongoClient client = new MongoClient(mongoDBSettings.Value.ConnectionURI); IMongoDatabase database = client.GetDatabase(mongoDBSettings.Value.DatabaseName); _playlistCollection = database.GetCollection<Playlist>(mongoDBSettings.Value.CollectionName); } public async Task<List<Playlist>> GetAsync() { } public async Task CreateAsync(Playlist playlist) { } public async Task AddToPlaylistAsync(string id, string movieId) {} public async Task DeleteAsync(string id) { } }
上記のコードでは、空の非同期関数を含む MongoDBService
という名前のクラスを定義します。このチュートリアル全体では、エンドポイントを作成する際にこれらの関数にコードを追加します。appsettings.json
ファイルで構成した設定は変数に設定されます。
サービスをアプリケーションに接続する
Program.cs
ファイルを開き、ファイルの先頭に次のコードを追加します。
using MongoExample.Models; using MongoExample.Services; var builder = WebApplication.CreateBuilder(args); builder.Services.Configure<MongoDBSettings>(builder.Configuration.GetSection("MongoDB")); builder.Services.AddSingleton<MongoDBService>();
上記のコードでは、GetSection()
関数は appsettings.json
ファイルの MongoDB
フィールドから設定をプルします。
Tip
テンプレート コードにすでに builder
変数がある場合は、それを 2 回追加しないでください。
ドキュメントモデルを作成する
サービスを設定したら、コレクションのデータモデルを作成できます。
Models
フォルダーに Playlist.cs
という名前の新しいファイルを作成し、次のコードを追加します。
using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; namespace MongoExample.Models; public class Playlist { [ ] [ ] public string? Id { get; set; } public string username { get; set; } = null!; [ ] [ ] public List<string> movieIds { get; set; } = null!; }
上記のコードでは、Id
フィールドは_id
フィールドで ObjectId
として直列化されています。フィールドは、アプリケーション内で string として表されます。
movieIds
フィールドは items
として直列化されます。JSON値を送受信する場合、フィールドには movieIds
ではなく items
という名前も付けられます。
ローカルクラスフィールドをドキュメントフィールドと直接一致させる場合は、カスタム マッピングを定義する必要はありません。例、前のコードの username
フィールドにはカスタム マッピングはありません。C#、 JSON、 MongoDBでは username
と呼ばれます。
この手順の完了により、 .NET Core で動作するコレクション用のMongoDBサービスとドキュメントモデルが作成されます。
CRUDエンドポイントの構築
このアプリケーションのCRUDエンドポイントを作成するには、プロジェクト内の 2 つの異なるファイルを更新する必要があります。このセクションでは、コントローラー内でエンドポイントを定義し、サービス内で対応する作業をアップデートする方法を学びます。
注意
データ検証
この例プロジェクトでは、 HTTPリクエストのデータ検証は行われていません。
コントローラーを作成する
プロジェクトに、Controllers
という名前のフォルダを作成します。Controllers
フォルダーに PlaylistController.cs
という名前の新しいファイルを作成し、次のコードを追加します。
using System; using Microsoft.AspNetCore.Mvc; using MongoExample.Services; using MongoExample.Models; namespace MongoExample.Controllers; [ ][ ]public class PlaylistController: Controller { private readonly MongoDBService _mongoDBService; public PlaylistController(MongoDBService mongoDBService) { _mongoDBService = mongoDBService; } [ ] public async Task<List<Playlist>> Get() {} [ ] public async Task<IActionResult> Post([FromBody] Playlist playlist) {} [ ] public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) {} [ ] public async Task<IActionResult> Delete(string id) {} }
PlaylistController
クラスには、単一のサービスクラスへのアクセスを取得するコンストラクター メソッドが含まれています。次に、このコントローラーの一連のエンドポイントがあります。
POST エンドポイントを介してデータを追加する
次のコードを使用するように、Services/MongoDBService.cs
にGo、CreateAsync
関数を更新します。
public async Task CreateAsync(Playlist playlist) { await _playlistCollection.InsertOneAsync(playlist); return; }
上記のコードでは、サービスの コンストラクター メソッドで _playlistCollection
を設定します。これにより、アプリケーションは、渡された Playlist
変数を受け取り、それを挿入する InsertOneAsync
メソッドを使用できるようになります。
POST
エンドポイントの作成を完了するには、Controllers/PlaylistController.cs
ファイルにGo、Post
メソッドを更新して、次のコードを使用します。
[ ]public async Task<IActionResult> Post([FromBody] Playlist playlist) { await _mongoDBService.CreateAsync(playlist); return CreatedAtAction(nameof(Get), new { id = playlist.Id }, playlist); }
POST
エンドポイントが実行されると、アプリケーションは.NET Core が解析する request
から Playlist
オブジェクトを取得し、それを サービス内の CreateAsync
関数に渡します。挿入後、コードはインタラクションに関する情報を返します。
GET エンドポイントを介したデータの読み取り
次のコードを使用するように、Services/MongoDBService.cs
にGo、GetAsync
関数を更新します。
public async Task<List<Playlist>> GetAsync() { return await _playlistCollection.Find(new BsonDocument()).ToListAsync(); }
上記のコードの Find
操作は、コレクションに存在するすべてのドキュメントを返します。
GET
エンドポイントの作成を完了するには、Controllers/PlaylistController.cs
ファイルにGo、Get
メソッドを更新して、次のコードを使用します。
[ ]public async Task<List<Playlist>> Get() { return await _mongoDBService.GetAsync(); }
PUT エンドポイントを使用したデータの更新
次のコードを使用するように、Services/MongoDBService.cs
にGo、AddToPlaylistAsync
関数を更新します。
public async Task AddToPlaylistAsync(string id, string movieId) { FilterDefinition<Playlist> filter = Builders<Playlist>.Filter.Eq("Id", id); UpdateDefinition<Playlist> update = Builders<Playlist>.Update.AddToSet<string>("movieIds", movieId); await _playlistCollection.UpdateOneAsync(filter, update); return; }
上記のコードでは、一致フィルターを設定して、どのドキュメントがアップデートを受信するかを判断することで、プレイリストにアイテムが追加されます。コードは、一意の Id
フィールドに基づいて一致します。次に、コードは更新基準を定義します。これは、配列にアイテムがまだ存在しない場合にのみ配列に追加する AddtoSet
操作です。
UpdateOneAsync
メソッドは、一致フィルターに複数の一致が返された場合でも、ドキュメントのみ を更新します。
PUT エンドポイントの作成を完了するには、Controllers/PlaylistController.cs
ファイルにGo、AddToPlaylist
関数を更新して次のコードを使用します。
[ ]public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) { await _mongoDBService.AddToPlaylistAsync(id, movieId); return NoContent(); }
DELETE エンドポイントを使用してデータを削除する
次のコードを使用するように、Services/MongoDBService.cs
にGo、DeleteAsync
関数を更新します。
public async Task DeleteAsync(string id) { FilterDefinition<Playlist> filter = Builders<Playlist>.Filter.Eq("Id", id); await _playlistCollection.DeleteOneAsync(filter); return; }
上記のコードでは、Id
フィールドの一意の値と一致するフィルター条件に基づいて単一のドキュメントが削除されます。
DELETE エンドポイントの作成を完了するには、Controllers/PlaylistController.cs
ファイルにGo、Delete
関数を更新して次のコードを使用します。
[ ]public async Task<IActionResult> Delete(string id) { await _mongoDBService.DeleteAsync(id); return NoContent(); }
この手順を完了すると、 RESTflu APIのCRUDエンドポイントの完全なセットが作成されます。
APIエンドポイントをテストする
エンドポイントが作成されたら、テンプレート.NET Coreアプリケーションに含まれる Swedge UIを使用してエンドポイントをテストできます。それには、Program.cs
ファイルにGo、WeatherForecast
クラスに関連するテンプレートプロジェクトからコードを削除します。 ファイルを更新して、次のコードを含めます。
// Adds services to the container to configure Swagger/OpenAPI builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configures the HTTP request pipeline if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); // Maps the endpoints for the API app.MapGet("/api/playlists", async (MongoDBService mongoDBService) => { var playlists = await mongoDBService.GetAsync(); return playlists; }) .WithName("GetPlaylists") .WithOpenApi(); app.MapPost("/api/playlists", async (MongoDBService mongoDBService, Playlist newPlaylist) => { await mongoDBService.CreateAsync(newPlaylist); return Results.Created($"/playlists/{newPlaylist.Id}", newPlaylist); }) .WithName("CreatePlaylist") .WithOpenApi(); app.MapPut("/api/playlists/{id}", async (MongoDBService mongoDBService, string id, string movieId) => { await mongoDBService.AddToPlaylistAsync(id, movieId); return Results.NoContent(); }) .WithName("AddMovieToPlaylist") .WithOpenApi(); app.MapDelete("/playlists/{id}", async (MongoDBService mongoDBService, string id) => { await mongoDBService.DeleteAsync(id); return Results.NoContent(); }) .WithName("DeletePlaylist") .WithOpenApi(); app.Run();
プロジェクトテンプレートからの繰り返しのコードを前述のコードに置き換えることができます。
次のコマンドを実行して、アプリケーションを実行します。
dotnet run
アプリケーションが起動したら、ブラウザを開き、構成済みのローカルホストURLにGoSwedge UIにアクセスします(例: http://localhost:5000/swagger
)。 次の画像は、Swedge UI がどのように表示されるかを示しています。

RESTflu APIの Swedge UI 。
各エンドポイントの Try it out ボタンをクリックすると、アプリケーションをテストできます。開始するには、/api/playlists
POST
エンドポイントにGo、データベースにデータを追加します。 次のサンプルデータを追加します。
{ "username": "testuser", "items": [ "1234", "5678" ] }
このリクエストを実行して、データベースにデータを挿入します。次に、GET
エンドポイントにGo、挿入したばかりのデータを確認できます。 また、PUT
と DELETE
エンドポイントをテストして、データをアップデートおよび削除できます。
次のステップ
このチュートリアルで説明する操作の詳細については、次のガイドを参照してください。