Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Tutorial: Crea una API RESTful usando el driver de .NET/C#

En este tutorial, puedes aprender a crear una API RESTful con endpoints que realicen operaciones básicas de crear, leer, actualizar y borrar (CRUD) en colecciones de un clúster de MongoDB Atlas.

Antes de iniciar este tutorial, realiza las siguientes acciones:

  • Configura una cuenta de MongoDB Atlas e implementa y configura un clúster que sea M0 o superior. Para ver las instrucciones, consulte Comienza con Atlas.

  • Instale .NET 6.0 o posterior en su equipo. Para instalar .NET, visita la Página de descarga de Microsoft .NET.

Nota

Compatibilidad de lenguaje

Este tutorial utiliza .NET Core 8.0, pero puedes usar cualquier versión posterior a .NET 6.0.

Ejecute los siguientes comandos en su terminal para crear un nuevo proyecto de .NET Core que use una plantilla de aplicación web:

dotnet new webapi -o MongoExample
cd MongoExample

Para añadir el controlador .NET/C# como una dependencia en tu proyecto, ejecuta el siguiente comando:

dotnet add package MongoDB.Driver

Los comandos anteriores crean un nuevo proyecto de aplicación web para .NET Core llamado MongoExample e instala el controlador más reciente de .NET/C#. El proyecto de plantilla incluye algunos archivos básicos que se pueden modificar para implementar una API RESTful.

En esta sección, puedes crear y configurar tu servicio de MongoDB y definir el modelo de datos para tu API RESTful.

1

Su servicio de MongoDB es responsable de establecer una conexión y trabajar directamente con documentos dentro de MongoDB. En su proyecto, cree una carpeta llamada Models. En la carpeta Models, crear un nuevo archivo llamado MongoDBSettings.cs. En este archivo, agregue el siguiente código:

namespace MongoExample.Models;
public class MongoDBSettings {
public string ConnectionURI { get; set; } = null!;
public string DatabaseName { get; set; } = null!;
public string CollectionName { get; set; } = null!;
}

El código anterior define una clase llamada MongoDBSettings que contiene información sobre tu conexión, el nombre de la base de datos y el nombre de la colección.

2

Puede encontrar los datos que se almacenan en los campos de clase definidos en la clase MongoDBSettings en el archivo appsettings.json de los proyectos. Abre este archivo y agrega la siguiente configuración:

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"MongoDB": {
"ConnectionURI": "<Atlas connection string>",
"DatabaseName": "sample_mflix",
"CollectionName": "playlist"
}
}

Este tutorial utiliza la base de datos sample_mflix y la colección playlist. Reemplace el marcador de posición <Atlas connection string> con su cadena de conexión de MongoDB Atlas. Para obtener más información sobre cómo encontrar tu cadena de conexión, consulta el tutorial Conéctate a tu clúster en la documentación de Atlas.

3

En tu proyecto, crea una carpeta llamada Services. En la carpeta Services, crea un nuevo archivo llamado MongoDBService.cs y agrega el siguiente código:

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) { }
}

El código anterior define una clase llamada MongoDBService que incluye funciones asíncronas vacías. A lo largo de este tutorial, agregará código a estas funciones a medida que cree sus puntos finales. La configuración que estableciste en el archivo appsettings.json se asignó a variables.

4

Abre el archivo Program.cs y añade el siguiente código en la parte superior del archivo:

using MongoExample.Models;
using MongoExample.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<MongoDBSettings>(builder.Configuration.GetSection("MongoDB"));
builder.Services.AddSingleton<MongoDBService>();

En el código anterior, la función GetSection() extrae la configuración del campo MongoDB en el archivo appsettings.json.

Tip

Si el código de la plantilla ya contiene la variable builder, no la añadas dos veces.

5

Ahora que el servicio está configurado, puede crear un modelo de datos para su colección.

En la carpeta Models, crea un nuevo archivo llamado Playlist.cs y agrega el siguiente código:

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!;
}

En el código anterior, el campo Id se serializa como un ObjectId en el campo _id. El campo se representa como una string en su aplicación.

El campo movieIds se serializa como items. Cuando envíes o recibas valores JSON, el campo también se denomina items en lugar de movieIds.

Si se planea que el campo de clase local coincida directamente con el campo del documento, no es necesario definir mapeos personalizados. Por ejemplo, el campo username en el código anterior no tiene asignaciones personalizadas. Se le llama "username" en C#, en JSON y en MongoDB.

Después de este paso, tienes un servicio MongoDB y un modelo orientado a documentos para tu colección que funciona con .NET Core.

Para crear los endpoints CRUD para esta aplicación, debes actualizar dos archivos diferentes dentro del proyecto. En esta sección, puede aprender cómo definir el punto final dentro de un controlador y actualizar el trabajo correspondiente dentro del servicio.

Nota

Validación de datos

En este proyecto de ejemplo no hay validación de datos para las solicitudes HTTP.

1

En tu proyecto, crea una carpeta llamada Controllers. En la carpeta Controllers, crea un nuevo archivo llamado PlaylistController.cs y agrega el siguiente código:

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) {}
}

La clase PlaylistController contiene un método constructor que obtiene acceso a su clase de servicio singleton. Luego, hay una serie de endpoints para este controlador.

2

Ve a Services/MongoDBService.cs y actualiza la función CreateAsync para usar el siguiente código:

public async Task CreateAsync(Playlist playlist) {
await _playlistCollection.InsertOneAsync(playlist);
return;
}

El código anterior establece la _playlistCollection en el método constructor del servicio. Esto le permite a su aplicación utilizar el método InsertOneAsync, que toma una variable Playlist transmitida e inserta.

Para completar la creación del endpoint POST, ve al archivo Controllers/PlaylistController.cs y actualiza el método Post para que utilice el siguiente código:

[HttpPost]
public async Task<IActionResult> Post([FromBody] Playlist playlist) {
await _mongoDBService.CreateAsync(playlist);
return CreatedAtAction(nameof(Get), new { id = playlist.Id }, playlist);
}

Cuando el endpoint POST se ejecuta, la aplicación toma el objeto Playlist del request, que .NET Core analiza y lo pasa a la función CreateAsync en el servicio. Después de la inserción, el código devuelve información sobre la interacción.

3

Ve a Services/MongoDBService.cs y actualiza la función GetAsync para usar el siguiente código:

public async Task<List<Playlist>> GetAsync() {
return await _playlistCollection.Find(new BsonDocument()).ToListAsync();
}

La operación Find en el código anterior devuelve todos los documentos que existen en la colección.

Para completar la creación del endpoint GET, ve al archivo Controllers/PlaylistController.cs y actualiza el método Get para que utilice el siguiente código:

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

Ve a Services/MongoDBService.cs y actualiza la función AddToPlaylistAsync para usar el siguiente código:

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;
}

El código precedente establece un filtro de coincidencia para determinar qué documento o documentos reciben una actualización, en este caso añadiendo un elemento a tu lista de reproducción. El código coincide según el campo Id, que es único. Luego, el código define los criterios de actualización, que es una operación AddtoSet que solo agrega un elemento al arreglo si este no existe ya en el arreglo.

Los métodos UpdateOneAsync sólo actualizan documentos, incluso si el filtro de coincidencia devuelve más de una coincidencia.

Para completar la creación del endpoint PUT, vaya al archivo Controllers/PlaylistController.cs y actualice la función AddToPlaylist para usar el siguiente código:

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

Ve a Services/MongoDBService.cs y actualiza la función DeleteAsync para usar el siguiente código:

public async Task DeleteAsync(string id) {
FilterDefinition<Playlist> filter = Builders<Playlist>.Filter.Eq("Id", id);
await _playlistCollection.DeleteOneAsync(filter);
return;
}

El código anterior borra un único documento basado en los criterios de filtro, que coincide con el valor único del campo Id.

Para completar la creación del endpoint de borrar, ve al archivo Controllers/PlaylistController.cs y actualiza la función Delete para utilizar el siguiente código:

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

Después de este paso, tendrás un conjunto completo de puntos finales CRUD para tu API RESTful.

Con los puntos finales creados, puede probarlos utilizando la Swagger Interfaz de Usuario que se incluye con la aplicación de plantilla .NET Core. Para ello, vaya al archivo Program.cs y elimine cualquier código del proyecto de plantilla relacionado con la clase WeatherForecast. Actualiza el archivo para incluir el siguiente código:

// 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();

Puedes reemplazar cualquier código repetitivo de la plantilla del proyecto con el código anterior.

Ejecuta el siguiente comando para ejecutar tu aplicación:

dotnet run

Después de que se inicie la aplicación, abre el navegador y ve a la URL localhost configurada para acceder a la Interfaz de Usuario de Swagger, por ejemplo http://localhost:5000/swagger. La siguiente imagen muestra el aspecto de la Interfaz de Usuario de Swagger:

Swagger UI

La interfaz Swagger Interfaz de Usuario para la API RESTful.

Puedes probar la aplicación haciendo clic en el Try it out botón en cada endpoint. Para comenzar, ve al endpoint /api/playlists POST para agregar algunos datos a la base de datos. Agregue los siguientes datos de muestra:

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

Ejecuta esta solicitud para insertar datos en la base de datos. Luego, puedes ir al endpoint GET para ver los datos que acabas de insertar. También puedes probar los endpoints PUT y DELETE para actualizar y borrar datos.

Para aprender más sobre las operaciones discutidas en este tutorial, consulta las siguientes guías:

  • Insertar documentos

  • Retrieve Data

  • Actualiza uno

  • Delete Documents

Volver

Especifica los documentos a devolver

En esta página