在.Net项目中使用MongoDB需要借助官方提供的MongoDB Driver来完成数据库的连接和各种数据操作,整体流程并不复杂,按照步骤操作即可快速实现功能。

环境准备
首先需要在项目中安装MongoDB的官方驱动包,目前主流的版本是2.x系列,支持.Net Framework和.Net Core/.Net 5及以上版本。可以通过NuGet包管理器搜索MongoDB.Driver进行安装,也可以在包管理器控制台执行以下命令:
Install-Package MongoDB.Driver
建立数据库连接
连接MongoDB需要指定连接字符串,连接字符串的格式根据部署方式不同有所区别,本地默认部署的连接字符串为mongodb://localhost:27017,如果MongoDB部署在远程服务器,需要替换对应的IP和端口。
以下是创建客户端和获取数据库对象的示例代码:
using MongoDB.Driver;
using System;
namespace MongoDBDemo
{
class MongoDBHelper
{
// MongoDB连接客户端
private static MongoClient _client;
// 目标数据库实例
private static IMongoDatabase _database;
/// <summary>
/// 初始化MongoDB连接
/// </summary>
/// <param name="connectionString">连接字符串</param>
/// <param name="databaseName">数据库名称</param>
public static void Init(string connectionString, string databaseName)
{
_client = new MongoClient(connectionString);
_database = _client.GetDatabase(databaseName);
}
/// <summary>
/// 获取指定集合
/// </summary>
/// <typeparam name="T">集合对应的实体类型</typeparam>
/// <param name="collectionName">集合名称</param>
/// <returns>集合对象</returns>
public static IMongoCollection<T> GetCollection<T>(string collectionName)
{
if (_database == null)
{
throw new InvalidOperationException("请先调用Init方法初始化数据库连接");
}
return _database.GetCollection<T>(collectionName);
}
}
}
定义实体类
MongoDB存储的是BSON格式的数据,在.Net中可以通过定义实体类来映射集合中的文档,默认情况下实体类的属性名会和BSON文档的字段名一一对应,也可以通过特性自定义映射规则。
以下是一个用户实体的示例:
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace MongoDBDemo
{
public class User
{
// 对应MongoDB文档的_id字段,类型为ObjectId
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
// 用户名
public string UserName { get; set; }
// 年龄
public int Age { get; set; }
// 注册时间
public DateTime RegisterTime { get; set; }
}
}
基础增删改查操作
新增数据
新增单条数据和批量新增数据的实现方式如下:
using MongoDB.Driver;
using System;
using System.Collections.Generic;
namespace MongoDBDemo
{
class OperateDemo
{
static void Main(string[] args)
{
// 初始化连接,数据库名为testdb,集合名为users
MongoDBHelper.Init("mongodb://localhost:27017", "testdb");
var userCollection = MongoDBHelper.GetCollection<User>("users");
// 新增单条数据
User singleUser = new User
{
UserName = "张三",
Age = 25,
RegisterTime = DateTime.Now
};
userCollection.InsertOne(singleUser);
Console.WriteLine($"新增单条用户成功,Id为:{singleUser.Id}");
// 批量新增数据
List<User> userList = new List<User>
{
new User { UserName = "李四", Age = 28, RegisterTime = DateTime.Now },
new User { UserName = "王五", Age = 22, RegisterTime = DateTime.Now }
};
userCollection.InsertMany(userList);
Console.WriteLine("批量新增用户成功");
}
}
}
查询数据
MongoDB Driver提供了丰富的查询方式,支持条件过滤、排序、分页等操作:
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
namespace MongoDBDemo
{
class QueryDemo
{
static void Main(string[] args)
{
MongoDBHelper.Init("mongodb://localhost:27017", "testdb");
var userCollection = MongoDBHelper.GetCollection<User>("users");
// 查询所有数据
List<User> allUsers = userCollection.Find(Builders<User>.Filter.Empty).ToList();
Console.WriteLine($"所有用户数量:{allUsers.Count}");
// 条件查询:查询年龄大于25的用户
var filter = Builders<User>.Filter.Gt(u => u.Age, 25);
List<User> adultUsers = userCollection.Find(filter).ToList();
Console.WriteLine($"年龄大于25的用户数量:{adultUsers.Count}");
// 排序加分页查询:按年龄降序,取前2条
List<User> pagedUsers = userCollection.Find(Builders<User>.Filter.Empty)
.Sort(Builders<User>.Sort.Descending(u => u.Age))
.Skip(0)
.Limit(2)
.ToList();
Console.WriteLine($"分页查询结果数量:{pagedUsers.Count}");
}
}
}
更新数据
更新操作分为更新单条和更新多条,支持部分字段更新和全量更新:
using MongoDB.Driver;
using System;
namespace MongoDBDemo
{
class UpdateDemo
{
static void Main(string[] args)
{
MongoDBHelper.Init("mongodb://localhost:27017", "testdb");
var userCollection = MongoDBHelper.GetCollection<User>("users");
// 更新单条:将用户名为张三的年龄改为26
var updateFilter = Builders<User>.Filter.Eq(u => u.UserName, "张三");
var updateDefinition = Builders<User>.Update.Set(u => u.Age, 26);
var updateResult = userCollection.UpdateOne(updateFilter, updateDefinition);
Console.WriteLine($"更新单条影响的行数:{updateResult.ModifiedCount}");
// 更新多条:将所有年龄小于25的用户年龄加1
var multiUpdateFilter = Builders<User>.Filter.Lt(u => u.Age, 25);
var multiUpdateDefinition = Builders<User>.Update.Inc(u => u.Age, 1);
var multiUpdateResult = userCollection.UpdateMany(multiUpdateFilter, multiUpdateDefinition);
Console.WriteLine($"更新多条影响的行数:{multiUpdateResult.ModifiedCount}");
}
}
}
删除数据
删除操作同样支持单条删除和批量删除:
using MongoDB.Driver;
using System;
namespace MongoDBDemo
{
class DeleteDemo
{
static void Main(string[] args)
{
MongoDBHelper.Init("mongodb://localhost:27017", "testdb");
var userCollection = MongoDBHelper.GetCollection<User>("users");
// 删除单条:删除用户名为王五的用户
var deleteFilter = Builders<User>.Filter.Eq(u => u.UserName, "王五");
var deleteResult = userCollection.DeleteOne(deleteFilter);
Console.WriteLine($"删除单条影响的行数:{deleteResult.DeletedCount}");
// 删除多条:删除年龄小于20的用户
var multiDeleteFilter = Builders<User>.Filter.Lt(u => u.Age, 20);
var multiDeleteResult = userCollection.DeleteMany(multiDeleteFilter);
Console.WriteLine($"删除多条影响的行数:{multiDeleteResult.DeletedCount}");
}
}
}
索引创建
为了提升查询效率,可以给常用的查询字段创建索引,以下是创建单字段索引和复合索引的示例:
using MongoDB.Driver;
using System;
namespace MongoDBDemo
{
class IndexDemo
{
static void Main(string[] args)
{
MongoDBHelper.Init("mongodb://localhost:27017", "testdb");
var userCollection = MongoDBHelper.GetCollection<User>("users");
// 创建单字段索引:给UserName字段创建升序索引
var singleIndex = new CreateIndexModel<User>(Builders<User>.IndexKeys.Ascending(u => u.UserName));
userCollection.Indexes.CreateOne(singleIndex);
Console.WriteLine("单字段索引创建成功");
// 创建复合索引:给Age降序、RegisterTime升序创建复合索引
var compoundIndex = new CreateIndexModel<User>(Builders<User>.IndexKeys
.Descending(u => u.Age)
.Ascending(u => u.RegisterTime));
userCollection.Indexes.CreateOne(compoundIndex);
Console.WriteLine("复合索引创建成功");
}
}
}
注意事项
- 连接字符串如果包含认证信息,格式为
mongodb://用户名:密码@服务器IP:端口,需要根据实际的MongoDB配置调整 - 实体类的Id属性如果使用
ObjectId类型,需要添加对应的特性,否则可能出现映射错误 - 生产环境中建议对数据库连接做单例处理,避免频繁创建客户端实例消耗资源
- 复杂查询可以结合MongoDB的聚合管道实现,MongoDB Driver提供了对应的
Aggregate方法支持
MongoDB.NetC#MongoDB_Driver数据库操作修改时间:2026-07-06 07:33:34