1. 环境准备与技术栈说明
本文基于.NET 6平台,使用MongoDB.Driver 2.19官方驱动库进行演示。建议使用Visual Studio 2022或Rider作为开发工具,MongoDB社区版建议使用6.0及以上版本。
安装NuGet包:
Install-Package MongoDB.Driver -Version 2.19.0
2. 基础连接配置
// 创建Mongo客户端实例
var settings = MongoClientSettings.FromConnectionString(
"mongodb://localhost:27017");
var client = new MongoClient(settings);
// 获取数据库和集合引用
IMongoDatabase database = client.GetDatabase("ECommerceDB");
IMongoCollection<Product> products = database.GetCollection<Product>("Products");
// 实体类定义
public class Product
{
[BsonId]
public ObjectId Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public int Stock { get; set; }
public DateTime LastUpdated { get; set; }
}
3. 文档更新操作全解
3.1 单字段更新
// 构建过滤器:找到名为"咖啡机"的商品
var filter = Builders<Product>.Filter.Eq(p => p.Name, "咖啡机");
// 创建更新定义:价格增加100元
var update = Builders<Product>.Update
.Set(p => p.Price, 599)
.CurrentDate(p => p.LastUpdated);
// 执行更新操作(仅更新第一个匹配文档)
var result = await products.UpdateOneAsync(filter, update);
Console.WriteLine($"匹配文档:{result.MatchedCount}, 更新文档:{result.ModifiedCount}");
3.2 多条件批量更新
// 组合条件:库存大于10且价格低于500的商品
var complexFilter = Builders<Product>.Filter.And(
Builders<Product>.Filter.Gt(p => p.Stock, 10),
Builders<Product>.Filter.Lt(p => p.Price, 500)
);
// 复合更新操作:库存减5,添加最后更新时间
var batchUpdate = Builders<Product>.Update
.Inc(p => p.Stock, -5)
.CurrentDate(p => p.LastUpdated);
// 执行批量更新
var updateResult = await products.UpdateManyAsync(complexFilter, batchUpdate);
3.3 数组操作示例
// 假设实体类新增Tags字段
public List<string> Tags { get; set; }
// 向文档的Tags数组添加新元素
var tagUpdate = Builders<Product>.Update
.AddToSet(p => p.Tags, "厨房电器")
.AddToSet(p => p.Tags, "智能设备");
await products.UpdateOneAsync(
Builders<Product>.Filter.Eq(p => p.Name, "智能电饭煲"),
tagUpdate);
4. 文档删除操作详解
4.1 条件删除
// 删除库存为0且30天未更新的商品
var deleteFilter = Builders<Product>.Filter.And(
Builders<Product>.Filter.Eq(p => p.Stock, 0),
Builders<Product>.Filter.Lt(p => p.LastUpdated, DateTime.UtcNow.AddDays(-30))
);
var deleteResult = await products.DeleteManyAsync(deleteFilter);
Console.WriteLine($"已删除{deleteResult.DeletedCount}条记录");
4.2 事务性删除
using (var session = await client.StartSessionAsync())
{
session.StartTransaction();
try
{
// 删除商品记录
var deleteResult = await products.DeleteOneAsync(
session,
Builders<Product>.Filter.Eq(p => p.Id, targetId));
// 关联操作:记录删除日志
var logCollection = database.GetCollection<DeleteLog>("DeleteLogs");
await logCollection.InsertOneAsync(session, new DeleteLog
{
DeletedId = targetId,
DeleteTime = DateTime.UtcNow
});
await session.CommitTransactionAsync();
}
catch
{
await session.AbortTransactionAsync();
throw;
}
}
5. 关联技术:LINQ集成
// 使用LINQ语法进行查询更新
var linqFilter = Builders<Product>.Filter.Where(p => p.Price < 100 && p.Stock > 20);
var linqUpdate = Builders<Product>.Update
.Set(p => p.Price, 99)
.Set(p => p.LastUpdated, DateTime.UtcNow);
await products.UpdateManyAsync(linqFilter, linqUpdate);
6. 应用场景分析
- 实时库存管理:电商系统的库存扣减
- 价格动态调整:促销活动的批量调价
- 数据归档清理:定期删除历史日志
- 标签管理系统:商品标签的实时更新
- 事务性操作:需要保证数据一致性的金融交易
7. 技术优缺点对比
优势:
- 原子性操作保证数据一致性
- 丰富的更新运算符($set, $inc等)
- 支持批量操作提升性能
- 事务支持(MongoDB 4.0+)
局限:
- 复杂查询的性能优化需要索引支持
- 嵌套文档更新语法较复杂
- 事务性能在分布式环境下需要调优
8. 关键注意事项
- 索引优化:为常用查询字段建立合适索引
- 写关注设置:根据业务需求调整WriteConcern
- 更新幂等性:设计可重复执行的更新操作
- 并发控制:使用版本号或时间戳处理并发更新
- 批量操作限制:单个请求不超过100MB文档大小
9. 最佳实践建议
- 对高频更新操作使用$inc运算符
- 重要操作记录审计日志
- 批量更新时合理控制批次大小
- 使用Projection验证更新结果
- 定期分析查询执行计划