ASP.NET Core 使用 MongoDB

ASP.NET Core 中使用 MongoDB 可以通过官方驱动 MongoDB.Driver 实现。以下是完整的集成步骤和示例代码:


1. 安装 MongoDB 驱动

复制代码
dotnet add package MongoDB.Driver

2. 配置 MongoDB 连接

appsettings.json
复制代码
{
  "MongoDB": {
    "ConnectionString": "mongodb://localhost:27017",
    "DatabaseName": "MyAppDB"
  }
}
注册 MongoDB 服务
复制代码
// Program.cs
using MongoDB.Driver;

var builder = WebApplication.CreateBuilder(args);

// 注册 MongoDB 配置
builder.Services.Configure<MongoDBSettings>(
    builder.Configuration.GetSection("MongoDB")
);

// 注册 IMongoDatabase 实例
builder.Services.AddSingleton<IMongoDatabase>(serviceProvider => {
    var settings = serviceProvider.GetRequiredService<IOptions<MongoDBSettings>>().Value;
    var client = new MongoClient(settings.ConnectionString);
    return client.GetDatabase(settings.DatabaseName);
});

// 自定义 MongoDB 上下文(可选)
builder.Services.AddScoped<MongoDBContext>();
配置类定义
复制代码
public class MongoDBSettings
{
    public string ConnectionString { get; set; }
    public string DatabaseName { get; set; }
}

// 自定义上下文类(可选)
public class MongoDBContext
{
    private readonly IMongoDatabase _database;
    
    public MongoDBContext(IMongoDatabase database)
    {
        _database = database;
    }

    public IMongoCollection<T> GetCollection<T>(string name)
    {
        return _database.GetCollection<T>(name);
    }
}

3. 定义数据模型

复制代码
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;

public class Product
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    [BsonElement("name")]
    public string Name { get; set; }

    [BsonElement("price")]
    public decimal Price { get; set; }
}

4. 实现数据访问层

仓储模式示例
复制代码
public interface IProductRepository
{
    Task<List<Product>> GetAllAsync();
    Task<Product> GetByIdAsync(string id);
    Task CreateAsync(Product product);
    Task UpdateAsync(string id, Product product);
    Task DeleteAsync(string id);
}

public class ProductRepository : IProductRepository
{
    private readonly IMongoCollection<Product> _collection;

    public ProductRepository(MongoDBContext context)
    {
        _collection = context.GetCollection<Product>("products");
    }

    public async Task<List<Product>> GetAllAsync()
    {
        return await _collection.Find(_ => true).ToListAsync();
    }

    public async Task<Product> GetByIdAsync(string id)
    {
        return await _collection.Find(p => p.Id == id).FirstOrDefaultAsync();
    }

    public async Task CreateAsync(Product product)
    {
        await _collection.InsertOneAsync(product);
    }

    public async Task UpdateAsync(string id, Product product)
    {
        await _collection.ReplaceOneAsync(p => p.Id == id, product);
    }

    public async Task DeleteAsync(string id)
    {
        await _collection.DeleteOneAsync(p => p.Id == id);
    }
}

// 注册仓储
builder.Services.AddScoped<IProductRepository, ProductRepository>();

5. 在控制器中使用

复制代码
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly IProductRepository _repository;

    public ProductsController(IProductRepository repository)
    {
        _repository = repository;
    }

    [HttpGet]
    public async Task<IActionResult> GetAll()
    {
        var products = await _repository.GetAllAsync();
        return Ok(products);
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetById(string id)
    {
        var product = await _repository.GetByIdAsync(id);
        return product == null ? NotFound() : Ok(product);
    }

    [HttpPost]
    public async Task<IActionResult> Create(Product product)
    {
        await _repository.CreateAsync(product);
        return CreatedAtAction(nameof(GetById), new { id = product.Id }, product);
    }
}

6. 高级操作

索引管理
复制代码
// 在仓储类构造函数中添加索引
var indexKeys = Builders<Product>.IndexKeys.Ascending(p => p.Name);
_collection.Indexes.CreateOne(new CreateIndexModel<Product>(indexKeys));
聚合查询
复制代码
public async Task<decimal> GetAveragePrice()
{
    var pipeline = new BsonDocument[]
    {
        new BsonDocument("$group", new BsonDocument
        {
            { "_id", BsonNull.Value },
            { "averagePrice", new BsonDocument("$avg", "$price") }
        })
    };

    var result = await _collection.AggregateAsync<BsonDocument>(pipeline);
    return result.First()["averagePrice"].AsDecimal;
}

7. 配置注意事项

  1. 连接池优化

    复制代码
    var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
    settings.MaxConnectionPoolSize = 100; // 默认 100
    settings.MinConnectionPoolSize = 10;
    var client = new MongoClient(settings);
  2. 超时设置

    复制代码
    settings.ConnectTimeout = TimeSpan.FromSeconds(30);
    settings.ServerSelectionTimeout = TimeSpan.FromSeconds(30);

最佳实践建议

  1. 使用异步方法 :所有数据库操作建议使用 Async 后缀方法

  2. 依赖注入 :通过构造函数注入 IMongoCollection<T> 或自定义仓储

  3. 错误处理 :全局捕获 MongoException

    复制代码
    app.UseExceptionHandler(errApp =>
    {
        errApp.Run(async context =>
        {
            var exception = context.Features.Get<IExceptionHandlerFeature>();
            if (exception?.Error is MongoException)
            {
                await context.Response.WriteAsync("Database error");
            }
        });
    });
  4. 环境隔离 :通过不同 appsettings.{Environment}.json 管理开发/生产环境配置


通过以上步骤,即可在 ASP.NET Core 中高效集成 MongoDB,实现灵活的数据存储方案。根据业务需求扩展仓储模式或直接使用 IMongoCollection<T> 进行操作。

相关推荐
杨云龙UP14 小时前
Docker 部署 MongoDB 6.0 数据库每日自动备份实践:本地 + 异地保留 7 天_20260429
linux·运维·数据库·mongodb·docker·容器·centos
稳联技术老娜1 天前
Profinet转EtherCAT网关通讯架构及EtherCAT超距故障解决原理
mongodb
别来无恙blwy2 天前
windows MongoDB升级-自动升级脚本-自动检测升级到任意版本
数据库·windows·mongodb
snow@li2 天前
数据库-MongoDB:常用语法 / MongoDB 核心知识技能梳理
数据库·mongodb
刘晨鑫16 天前
MongoDB数据库应用
数据库·mongodb
爬山算法6 天前
MongoDB(92)什么是变更流(Change Streams)?
数据库·mongodb
小冯不疯6 天前
旺店通与金蝶云星空入库单管理对接方案
mongodb
MongoDB 数据平台7 天前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
忍冬行者7 天前
MongoDB 三节点副本集离线部署运维手册
运维·数据库·mongodb
卢傢蕊8 天前
MongoDB
数据库·mongodb