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> 进行操作。

相关推荐
观测云7 小时前
MongoDB 可观测性最佳实践
数据库·mongodb
gongzemin10 小时前
Mac 安装MongoDB 社区版
后端·mongodb
数据潜水员20 小时前
MongoDB下载安装
mongodb
可观测性用观测云1 天前
MongoDB 可观测性最佳实践
mongodb
新知图书2 天前
Windows下安装MongoDB 8
数据库·windows·mongodb
Cacciatore->2 天前
MongoDB 介绍与部署
数据库·mongodb
小伍_Five3 天前
MongoDB副本集部署完整教程
数据库·mongodb·部署
其实我就是个萌新3 天前
使用spring data MongoDB对MongoDB进行简单CURD操作示例
java·mongodb·spring
帅维维3 天前
MongoDB中的游标(Cursor)
数据库·mongodb