1. 先来杯咖啡,聊聊场景

去年某电商平台大促时,每秒要处理十万级订单。他们用传统关系型数据库遇到了扩展瓶颈,后来迁移到MongoDB云服务后吞吐量提升了6倍。这正体现了MongoDB在高并发写入动态数据结构场景下的优势:

  • 物联网设备高频数据采集(每台设备每秒写入50+数据点)
  • 社交平台用户行为日志存储(支持嵌套JSON结构)
  • 电商平台商品规格管理(不同类目属性差异大)

举个实际场景:某智能家居系统需要存储百万设备的状态变更记录。用SQL可能需要设计几十个字段的表结构,而MongoDB只需要这样保存:

{
    "deviceId": "THP-8800",
    "timestamp": ISODate("2024-05-20T08:30:00Z"),
    "status": {
        "temperature": 26.5,
        "humidity": 58,
        "powerConsumption": 0.75
    }
}

2. 手把手配置云端连接

2.1 环境准备

# 在NuGet包管理器执行
Install-Package MongoDB.Driver -Version 2.19.1

2.2 连接云数据库的三种姿势

方式一:基础连接(适合测试环境)

var connectionString = "mongodb+srv://<username>:<password>@cluster0.abcd.mongodb.net/?retryWrites=true&w=majority";
var client = new MongoClient(connectionString);
var database = client.GetDatabase("SmartHomeDB");

方式二:SSL加密连接(生产环境必备)

var settings = new MongoClientSettings {
    Server = new MongoServerAddress("cluster0.abcd.mongodb.net", 27017),
    Credential = MongoCredential.CreateCredential("admin", "user", "p@ssw0rd"),
    UseTls = true,
    SslSettings = new SslSettings {
        CheckCertificateRevocation = false
    }
};
var secureClient = new MongoClient(settings);

方式三:连接池优化(高并发场景)

var poolSettings = new MongoClientSettings {
    MaxConnectionPoolSize = 100,  // 默认100
    MinConnectionPoolSize = 10,   // 默认0
    WaitQueueTimeout = TimeSpan.FromSeconds(30)
};
var pooledClient = new MongoClient(poolSettings);

3. 来点干货:CRUD实战演练

3.1 数据模型定义

public class DeviceLog {
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    [BsonElement("device_id")]
    public string DeviceId { get; set; }

    [BsonElement("metrics")]
    public Dictionary<string, object> Metrics { get; set; }

    [BsonDateTimeOptions(Kind = DateTimeKind.Utc)]
    public DateTime Timestamp { get; set; }
}

3.2 批量插入性能测试

var collection = database.GetCollection<DeviceLog>("device_logs");
var batch = new List<DeviceLog>();

// 生成10万条测试数据
for (int i = 0; i < 100000; i++) {
    batch.Add(new DeviceLog {
        DeviceId = $"DEV_{i % 1000}",
        Metrics = new Dictionary<string, object> {
            ["temp"] = rnd.Next(20, 40),
            ["volt"] = rnd.NextDouble() * 5
        },
        Timestamp = DateTime.UtcNow.AddSeconds(-i)
    });
}

// 批量插入耗时约3.2秒(AWS M50实例测试结果)
var sw = Stopwatch.StartNew();
await collection.InsertManyAsync(batch);
Console.WriteLine($"插入耗时:{sw.ElapsedMilliseconds}ms");

4. 避坑指南:血的教训总结

4.1 索引优化的艺术

// 创建复合TTL索引(自动删除30天前的日志)
var indexKeys = Builders<DeviceLog>.IndexKeys
    .Ascending(d => d.DeviceId)
    .Ascending(d => d.Timestamp);
var indexOptions = new CreateIndexOptions {
    ExpireAfter = TimeSpan.FromDays(30)
};
collection.Indexes.CreateOne(new CreateIndexModel<DeviceLog>(indexKeys, indexOptions));

4.2 查询优化实战

// 错误示范:全表扫描
var slowQuery = collection.Find(d => d.Timestamp > DateTime.UtcNow.AddDays(-1));

// 正确姿势:使用索引提示
var fastQuery = collection.Find(d => d.Timestamp > DateTime.UtcNow.AddDays(-1))
    .Hint("{ device_id: 1, timestamp: -1 }");

5. 技术选型时的灵魂拷问

优势亮剑时刻:

  • 灵活模式:随时增减字段不用改表结构
  • 横向扩展:分片集群轻松应对PB级数据
  • 地理空间查询:原生支持LBS应用

需要警惕的短板:

  • 事务支持:4.0+版本才支持多文档事务
  • 内存消耗:建议配置SSD+足够内存
  • 关联查询:$lookup性能不如SQL Join

6. 云服务配置的五个关键点

  1. 白名单配置:必须设置IP白名单
  2. 监控告警:关注Connections和Oplog指标
  3. 版本对应:确保驱动版本与云服务兼容
  4. 备份策略:建议开启时间点恢复
  5. 连接字符串:使用+srv记录自动发现分片

7. 总结与展望

在开发某工业物联网平台时,我们通过MongoDB云服务实现了日均10亿数据点的采集。使用BulkWrite+索引优化后,写入吞吐量从2k/s提升到15k/s。但要注意,当单文档超过16MB时需要拆分存储。

未来的趋势是结合Change Streams实现实时数据处理,搭配Azure Functions等无服务架构,可以构建出更强大的数据管道。