AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

RESTになってAPIを作成する

このチュートリアルでは、 MongoDB Atlasクラスター内のコレクション全体で基本的な作成、読み取り、アップデート、削除( CRUD )操作を実行するエンドポイントを使用して RESTless APIを作成する方法を学びます。

このチュートリアルを開始する前に、次のアクションを実行してください。

  • MongoDB Atlasアカウントを設定し、M0 以上のクラスターを配置して構成します。手順を表示するには、MongoDBスタートガイドを参照してください。

  • マシンに.NET 6.0 以降をインストールします。.NETをインストールするには、Microsoft .NETダウンロード ページ にアクセスします。

注意

言語互換性

このチュートリアルでは.NET Core 8.0 を使用していますが、 .NET 6.0 以降の任意のバージョンを使用できます。

ターミナルで次のコマンドを実行して、ウェブアプリケーションテンプレートを使用する新しい.NET Coreプロジェクトを作成します。

dotnet new webapi -o MongoExamplecd MongoExample

.NET/ C#ドライバーを依存関係としてプロジェクトに追加するには、次のコマンドを実行します。

dotnet add package MongoDB.Driver

上記のコマンドでは、MongoExample という名前の.NET Core 用の新しいウェブアプリケーションプロジェクトを作成し、最新の.NET/ C#ドライバーをインストールします。テンプレートプロジェクトには、 REST有効APIを実装するために変更するいくつかの定型ファイルが含まれています。

このセクションでは、 MongoDBサービスを作成および構成し、 RESTflu APIのデータモデルを定義できます。

MongoDB サービスの作成

1

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 という名前のクラスが定義されます。

2

プロジェクトの 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 ドキュメントの「 クラスターへの接続 」チュートリアルを参照してください。

3

プロジェクトに、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ファイルで構成した設定は変数に設定されます。

4

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 回追加しないでください。

5

サービスを設定したら、コレクションのデータモデルを作成できます。

Models フォルダーに Playlist.cs という名前の新しいファイルを作成し、次のコードを追加します。

using MongoDB.Bson;using MongoDB.Bson.Serialization.Attributes;using System.Text.Json.Serialization; namespace MongoExample.Models; public class Playlist { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string? Id { get; set; } public string username { get; set; } = null!; [BsonElement("items")] [JsonPropertyName("items")] 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エンドポイントを作成するには、プロジェクト内の 2 つの異なるファイルを更新する必要があります。このセクションでは、コントローラー内でエンドポイントを定義し、サービス内で対応する作業をアップデートする方法を学びます。

注意

データ検証

この例プロジェクトでは、 HTTPリクエストのデータ検証は行われていません。

MongoDB と交流するエンドポイントをビルドする

1

プロジェクトに、Controllers という名前のフォルダを作成します。Controllers フォルダーに PlaylistController.cs という名前の新しいファイルを作成し、次のコードを追加します。

using System;using Microsoft.AspNetCore.Mvc;using MongoExample.Services;using MongoExample.Models; namespace MongoExample.Controllers; [Controller][Route("api/[controller]")]public class PlaylistController: Controller { private readonly MongoDBService _mongoDBService; public PlaylistController(MongoDBService mongoDBService) { _mongoDBService = mongoDBService; } [HttpGet] public async Task<List<Playlist>> Get() {} [HttpPost] public async Task<IActionResult> Post([FromBody] Playlist playlist) {} [HttpPut("{id}")] public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) {} [HttpDelete("{id}")] public async Task<IActionResult> Delete(string id) {} }

PlaylistControllerクラスには、単一のサービスクラスへのアクセスを取得するコンストラクター メソッドが含まれています。次に、このコントローラーの一連のエンドポイントがあります。

2

次のコードを使用するように、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 メソッドを更新して、次のコードを使用します。

[HttpPost]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 関数に渡します。挿入後、コードはインタラクションに関する情報を返します。

3

次のコードを使用するように、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 メソッドを更新して、次のコードを使用します。

[HttpGet]public async Task<List<Playlist>> Get() { return await _mongoDBService.GetAsync();}
4

次のコードを使用するように、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 関数を更新して次のコードを使用します。

[HttpPut("{id}")]public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) { await _mongoDBService.AddToPlaylistAsync(id, movieId); return NoContent();}
5

次のコードを使用するように、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 関数を更新して次のコードを使用します。

[HttpDelete("{id}")]public async Task<IActionResult> Delete(string id) { await _mongoDBService.DeleteAsync(id); return NoContent();}

この手順を完了すると、 RESTflu APIのCRUDエンドポイントの完全なセットが作成されます。

エンドポイントが作成されたら、テンプレート.NET Coreアプリケーションに含まれる Swedge UIを使用してエンドポイントをテストできます。それには、Program.csファイルにGo、WeatherForecastクラスに関連するテンプレートプロジェクトからコードを削除します。 ファイルを更新して、次のコードを含めます。

// Adds services to the container to configure Swagger/OpenAPIbuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configures the HTTP request pipelineif (app.Environment.IsDevelopment()){ app.UseSwagger(); app.UseSwaggerUI();} app.UseHttpsRedirection(); // Maps the endpoints for the APIapp.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 がどのように表示されるかを示しています。

Swagger UI

RESTflu APIの Swedge UI 。

各エンドポイントの Try it out ボタンをクリックすると、アプリケーションをテストできます。開始するには、/api/playlists POST エンドポイントにGo、データベースにデータを追加します。 次のサンプルデータを追加します。

{ "username": "testuser", "items": [ "1234", "5678" ]}

このリクエストを実行して、データベースにデータを挿入します。次に、GET エンドポイントにGo、挿入したばかりのデータを確認できます。 また、PUT と DELETE エンドポイントをテストして、データをアップデートおよび削除できます。

このチュートリアルで説明する操作の詳細については、次のガイドを参照してください。