安装 MongoDB.Driver 4.0+ 官方包并全局复用 MongoClient 实例,通过 GetDatabase 和 GetCollection 获取数据库与集合,所有操作必须使用 async/await 方法。

安装 MongoDB.Driver 包是第一步
不装对版本,后面所有代码都跑不起来。用 NuGet 安装时务必选官方驱动:MongoDB.Driver(不是 MongoDB.Driver.Core 或旧版 MongoDB.Driver.Legacy)。.NET 6+ 项目推荐用 4.0+ 版本,它原生支持 async/await,且 API 更统一。
常见错误:手动下载 DLL 或引用低版本,导致 MongoClient 构造失败、InsertOneAsync 找不到,或序列化出错。
- VS 中右键项目 → “管理 NuGet 包” → 搜索
MongoDB.Driver→ 安装最新稳定版 - 命令行方式:
dotnet add package MongoDB.Driver - 确认项目文件里出现类似:
连接字符串和 MongoClient 实例不能复用错
MongoClient 是线程安全的、重量级对象,**必须全局复用**,不能每次操作都 new 一个。它内部维护连接池,频繁创建会耗尽 socket 资源或触发超时。
典型错误:在 Repository 方法里写 var client = new MongoClient("..."),尤其在 Web API 的 Action 里 —— 请求一多就卡死或报 TimeoutException。
- ASP.NET Core 中应注册为单例:
services.AddSingleton(sp => new MongoClient("mongodb://localhost:27017")) - 控制台程序可声明为
static readonly字段 - 连接字符串带认证时格式为:
"mongodb://user:pass@localhost:27017/admin?authSource=admin";本地测试可省略认证部分
获取数据库和集合要用 GetDatabase / GetCollection
MongoClient 本身不直接操作数据,要先通过 GetDatabase 拿到 IMongoDatabase,再用 GetCollection 获取类型化的 IMongoCollection。泛型参数 T 决定了序列化行为 —— 驱动会按属性名映射字段,不依赖特性也能工作,但建议加 [BsonElement] 明确控制。
容易忽略的点:集合名默认是类名小写(如 User 类对应集合 user),但实际开发中常需自定义,比如用 GetCollection。
- 示例:
var db = client.GetDatabase("testdb"); var users = db.GetCollection("users"); -
User类属性若为public string Name { get; set; },默认存为{"Name": "Alice"};加[BsonElement("name")]后才存为{"name": "Alice"} - 集合不存在时,首次写入会自动创建,无需提前建表
增删改查必须用 async 方法,别漏掉 await
新版驱动所有 I/O 操作都是异步的,同步方法(如 InsertOne)已被标记为过时,强行使用可能阻塞线程或抛 NotSupportedException。尤其在 ASP.NET Core 中,不用 await 会导致上下文丢失、返回空结果或死锁。
典型错误:写 users.InsertOne(new User {...}); 而没加 await,表面看不报错,但数据根本没进库。
- 插入:
await users.InsertOneAsync(new User { Name = "Bob" }); - 查询:
var result = await users.Find(u => u.Name == "Bob").FirstOrDefaultAsync(); - 更新:
await users.UpdateOneAsync(u => u.Name == "Bob", Builders.Update.Set(u => u.Name, "Robert")); - 删除:
await users.DeleteManyAsync(u => u.Name.StartsWith("R"));
真正麻烦的不是语法,而是序列化规则和连接生命周期管理。比如 DateTime 默认存成 UTC 时间,前端传来的本地时间不转换就会错位;又比如 MongoClient 被 GC 回收后,后续请求会静默失败 —— 这些细节比“怎么连上”更值得盯紧。











