在 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. 配置注意事项
-
连接池优化
var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString)); settings.MaxConnectionPoolSize = 100; // 默认 100 settings.MinConnectionPoolSize = 10; var client = new MongoClient(settings);
-
超时设置
settings.ConnectTimeout = TimeSpan.FromSeconds(30); settings.ServerSelectionTimeout = TimeSpan.FromSeconds(30);
最佳实践建议
-
使用异步方法 :所有数据库操作建议使用
Async
后缀方法 -
依赖注入 :通过构造函数注入
IMongoCollection<T>
或自定义仓储 -
错误处理 :全局捕获
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"); } }); });
-
环境隔离 :通过不同
appsettings.{Environment}.json
管理开发/生产环境配置
通过以上步骤,即可在 ASP.NET Core 中高效集成 MongoDB,实现灵活的数据存储方案。根据业务需求扩展仓储模式或直接使用 IMongoCollection<T>
进行操作。