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. 应用场景分析

  1. 实时库存管理:电商系统的库存扣减
  2. 价格动态调整:促销活动的批量调价
  3. 数据归档清理:定期删除历史日志
  4. 标签管理系统:商品标签的实时更新
  5. 事务性操作:需要保证数据一致性的金融交易

7. 技术优缺点对比

优势

  • 原子性操作保证数据一致性
  • 丰富的更新运算符($set, $inc等)
  • 支持批量操作提升性能
  • 事务支持(MongoDB 4.0+)

局限

  • 复杂查询的性能优化需要索引支持
  • 嵌套文档更新语法较复杂
  • 事务性能在分布式环境下需要调优

8. 关键注意事项

  1. 索引优化:为常用查询字段建立合适索引
  2. 写关注设置:根据业务需求调整WriteConcern
  3. 更新幂等性:设计可重复执行的更新操作
  4. 并发控制:使用版本号或时间戳处理并发更新
  5. 批量操作限制:单个请求不超过100MB文档大小

9. 最佳实践建议

  1. 对高频更新操作使用$inc运算符
  2. 重要操作记录审计日志
  3. 批量更新时合理控制批次大小
  4. 使用Projection验证更新结果
  5. 定期分析查询执行计划