当前位置: 首页 > news >正文

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

相关文章:

  • Git Flow 分支管理策略
  • LeetCode算法题(Go语言实现)_01
  • GR00T N1——英伟达开源的通用人形VLA:类似Helix的快与慢双系统,且可类似ViLLA利用海量的无标注视频做训练
  • Docker和Dify学习笔记
  • c++简单实现redis
  • 使用LLaMA Factory微调导出模型,并用ollama运行,用open webui使用该模型
  • 基于javaweb的SpringBoot成绩管理系统设计与实现(源码+文档+部署讲解)
  • 优化广告投放算法
  • Unity Shader编程】之渲染流程之深度及pass详解
  • Umi-OCR- OCR 文字识别工具,支持截图、批量图片排版解析
  • Oracle 19C reverse反向索引测试
  • 安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错的原因排查
  • AI对话框实现
  • Workerman5.0如何实现一对一聊天
  • 实体机安装linux视频教程。windows和ubuntu共存。启动时选择切换引导系统。
  • 两个常用的用于读写和操作DXF文件C#库:netDxf 和 DXF.NET
  • Redis命令详解--集合
  • 服务器——报错解决:移动文件时,bash: /usr/bin/mv: Argument list too long
  • [密码学实战]Java实现抗量子Kyber512与Dilithium2算法及详解
  • Facebook 如何影响元宇宙的发展趋势
  • 广药集团原董事长李楚源被“双开”:去年8月被查,曾多次发表争议言论
  • 张巍任中共河南省委副书记
  • 美官方将使用华为芯片视作违反美出口管制行为,外交部回应
  • 新城悦服务:独董许新民辞任,新任独董与另两人组成调查委员会将调查与关联方资金往来
  • 美国将与阿联酋合作建立海外最大的人工智能数据中心
  • 最高检公布一起离婚纠纷典型案例:推动离婚经济补偿制度落实