快速上手ASP .NET Core 8与MongoDB整合

发布于:2025-07-11 ⋅ 阅读:(15) ⋅ 点赞:(0)

话不多说,先了解一下MongoDB,在后端服务中选择一个数据库,是由最适合项目应用场景的架构决策所决定的。在做出决策前就需要了解和学习数据库的相关特性,从数据库官网学习了解它的特性是最适合不过的了。

MongoDB官方手册网站:MongoDB是什么? - 数据库手册 - MongoDB Docs

MongoDB .NET/C# 驱动程序手册网站:快速入门 - C#/.NET 驱动程序 v3.4 - MongoDB Docs

1、添加MongoDB.Driver

dotnet add package MongoDB.Driver

2、添加MongoDB配置信息到appsettings.json中

"MongoDBConfig": {
  "BooksCollectionName": "Book",
  "DatabaseName": "BookStoreDB",
  "ConnectionString": "mongodb://localhost:27017/",
}

3、创建MongoDB配置信息类

public class MongoDBConfig
{
    public string BookCollectionName { get; set; } = string.Empty;

    public string DatabaseName { get; set; } = string.Empty;

    public string ConnectionString { get; set; } = string.Empty;
}

4、创建实体类-Book

public class Book
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; } = ObjectId.GenerateNewId().ToString();

    [BsonElement("Name")]
    public string BookName { get; set; } = string.Empty;

    public decimal Price { get; set; }

    public string Category { get; set; } = string.Empty;

    public string Author { get; set; } = string.Empty;

    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime CreationTime { get; set; } = DateTime.Now;
}

注:[BsonDateTimeOptions(Kind = DateTimeKind.Local)]必须要添加的,因为MongoDB写入时间是协调世界时(UTC),不加这样注解,查询出来结果会有时区误差。

5、创建自定义MongoDB上下文

public class MongoDBContext
{
    public IMongoCollection<Book> Books { get; }

    public MongoDBContext(MongoDBConfig mongodbConfig)
    {
        if (mongodbConfig != null)
        {
            if (string.IsNullOrEmpty(mongodbConfig.ConnectionString))
                throw new ArgumentException("MongoDB connection is not configured");

            var client = new MongoClient(mongodbConfig.ConnectionString);
            var database = client.GetDatabase(mongodbConfig.DatabaseName);

            Books = database.GetCollection<User>(mongodbConfig.BookCollectionName);
        }
        else
        {
            throw new ArgumentNullException(nameof(mongodbConfig));
        }
    }
}

6、创建自定义MongoDB扩展注入服务

public static class MongoDBServiceExtensions
{
    public static IServiceCollection AddMongoDB(this IServiceCollection services, IConfiguration configuration)
    {
        services.Configure<MongoDBConfig>(configuration.GetSection("MongoDBConfig"));

        services.AddSingleton<MongoDBContext>(provider =>
        {
            var settings = configuration.GetSection("MongoDBConfig").Get<MongoDBConfig>();
            return settings == null
                ? throw new InvalidOperationException("MongoDBConfig is not configured properly.")
                : new MongoDBContext(settings);
        });

        return services;
    }
}

注:这里为什么会将MongoDBContext注册为单例服务,因为官方文档推荐单例模式

7、Program.cs文件中注入MongoDB

builder.Services.AddMongoDB(builder.Configuration);

8、使用MongoDB

[ApiController]
[Route("api/[controller]")]

public class BookController : ControllerBase
{
    private readonly ILogger<BookController> _logger;
    private readonly MongoDBContext _mongodbContext;

    public BookController(MongoDBContext mongodbContext, ILogger<BookController> logger)
    {
        _logger = logger;
        _mongodbContext = mongodbContext;
    }

    [HttpGet]
    public async Task<List<Book>> GetList()
    {
        return await _mongodbContext.Books.Find(_ => true).ToListAsync();
    }


    [HttpGet("{id:length(24)}")]
    public async Task<ActionResult<Book>> Get(string id)
    {
        var book = await _mongodbContext.Books.Find(x => x.Id == id).FirstOrDefaultAsync();

        if (book is null)
        {
            return NotFound();
        }

        return book;
    }

    [HttpPost]
    public async Task<IActionResult> Post(Book newBook)
    {
        await _mongodbContext.Books.InsertOneAsync(newBook);

        return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);
    }

    [HttpPut("{id:length(24)}")]
    public async Task<IActionResult> Update(string id, Book updatedBook)
    {
        var book = await _mongodbContext.Books.Find(x => x.Id == id).FirstOrDefaultAsync();

        if (book is null)
        {
            return NotFound();
        }

        updatedBook.Id = book.Id;

        await _mongodbContext.Books.ReplaceOneAsync(x => x.Id == id, updatedBook); ;

        return NoContent();
    }

    [HttpDelete("{id:length(24)}")]
    public async Task<IActionResult> Delete(string id)
    {
        var book = await _mongodbContext.Books.Find(x => x.Id == id).FirstOrDefaultAsync();

        if (book is null)
        {
            return NotFound();
        }

        await _mongodbContext.Books.DeleteOneAsync(x => x.Id == id);

        return NoContent();
    }
}

 


网站公告

今日签到

点亮在社区的每一天
去签到