C# 连接MongoDB方法 C#如何使用官方驱动操作MongoDB

来源:这里教程网 时间:2026-02-21 17:41:38 作者:

安装 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
确认项目文件里出现类似:
<packagereference include="MongoDB.Driver" version="4.12.0"></packagereference>

连接字符串和 MongoClient 实例不能复用错

MongoClient
是线程安全的、重量级对象,**必须全局复用**,不能每次操作都 new 一个。它内部维护连接池,频繁创建会耗尽 socket 资源或触发超时。

典型错误:在 Repository 方法里写

var client = new MongoClient("...")
,尤其在 Web API 的 Action 里 —— 请求一多就卡死或报
TimeoutException

ASP.NET Core 中应注册为单例:
services.AddSingleton<imongoclient>(sp => new MongoClient("mongodb://localhost:27017"))</imongoclient>
控制台程序可声明为
static readonly
字段
连接字符串带认证时格式为:
"mongodb://user:pass@localhost:27017/admin?authSource=admin"
;本地测试可省略认证部分

获取数据库和集合要用 GetDatabase / GetCollection

MongoClient
本身不直接操作数据,要先通过
GetDatabase
拿到
IMongoDatabase
,再用
GetCollection<t></t>
获取类型化的
IMongoCollection<t></t>
。泛型参数
T
决定了序列化行为 —— 驱动会按属性名映射字段,不依赖特性也能工作,但建议加
[BsonElement]
明确控制。

容易忽略的点:集合名默认是类名小写(如

User
类对应集合
user
),但实际开发中常需自定义,比如用
GetCollection<user>("users")</user>

示例:
var db = client.GetDatabase("testdb"); var users = db.GetCollection<user>("users");</user>
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<user>.Update.Set(u => u.Name, "Robert"));</user>
删除:
await users.DeleteManyAsync(u => u.Name.StartsWith("R"));

真正麻烦的不是语法,而是序列化规则和连接生命周期管理。比如

DateTime
默认存成 UTC 时间,前端传来的本地时间不转换就会错位;又比如
MongoClient
被 GC 回收后,后续请求会静默失败 —— 这些细节比“怎么连上”更值得盯紧。

相关推荐