在.Net项目中使用MongoDB可以快速实现非结构化数据的存储与管理,相比传统关系型数据库,它更适合处理字段不固定、数据量增长快的业务场景,比如用户行为日志、商品动态属性存储等。

环境准备与驱动安装
首先需要在本地或服务器安装MongoDB服务,安装完成后启动MongoDB服务。接着在.Net项目中安装MongoDB官方驱动,目前主流的驱动是MongoDB.Driver,可以通过NuGet包管理器安装,也可以在包管理器控制台执行以下命令:
Install-Package MongoDB.Driver
建立数据库连接
连接MongoDB需要指定服务地址、数据库名称,还可以配置认证信息。以下是基础的连接代码示例:
using MongoDB.Driver;
using System;
namespace MongoDBDemo
{
public class MongoDBHelper
{
// MongoDB连接字符串,本地默认端口为27017
private static readonly string connectionString = "mongodb://127.0.0.1:27017";
// 数据库名称
private static readonly string databaseName = "test_db";
public static IMongoDatabase GetDatabase()
{
var client = new MongoClient(connectionString);
return client.GetDatabase(databaseName);
}
}
}
定义数据实体类
操作MongoDB的文档需要对应实体类,MongoDB的文档_id字段默认是ObjectId类型,我们可以在实体类中定义对应属性:
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace MongoDBDemo
{
public class User
{
// 对应MongoDB文档的_id字段
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string UserName { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
}
实现基础CRUD操作
新增数据
新增单条或多条数据的实现代码如下:
using MongoDB.Driver;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace MongoDBDemo
{
public class UserRepository
{
private readonly IMongoCollection<User> _userCollection;
public UserRepository()
{
var database = MongoDBHelper.GetDatabase();
_userCollection = database.GetCollection<User>("user");
}
// 新增单条用户数据
public async Task AddUserAsync(User user)
{
await _userCollection.InsertOneAsync(user);
}
// 批量新增用户数据
public async Task AddUsersAsync(List<User> users)
{
await _userCollection.InsertManyAsync(users);
}
}
}
查询数据
可以根据不同条件查询数据,以下是常见的查询示例:
using MongoDB.Driver;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace MongoDBDemo
{
public class UserRepository
{
// 省略构造函数等重复代码
// 查询所有用户
public async Task<List<User>> GetAllUsersAsync()
{
return await _userCollection.Find(_ => true).ToListAsync();
}
// 根据用户名查询用户
public async Task<User> GetUserByUserNameAsync(string userName)
{
var filter = Builders<User>.Filter.Eq(u => u.UserName, userName);
return await _userCollection.Find(filter).FirstOrDefaultAsync();
}
// 查询年龄大于指定值的用户
public async Task<List<User>> GetUsersByAgeGreaterAsync(int age)
{
var filter = Builders<User>.Filter.Gt(u => u.Age, age);
return await _userCollection.Find(filter).ToListAsync();
}
}
}
更新数据
更新操作需要指定过滤条件和更新内容,以下是更新示例:
using MongoDB.Driver;
using System.Threading.Tasks;
namespace MongoDBDemo
{
public class UserRepository
{
// 省略构造函数等重复代码
// 更新用户邮箱
public async Task UpdateUserEmailAsync(string userId, string newEmail)
{
var filter = Builders<User>.Filter.Eq(u => u.Id, userId);
var update = Builders<User>.Update.Set(u => u.Email, newEmail);
await _userCollection.UpdateOneAsync(filter, update);
}
// 批量更新年龄小于18的用户年龄加1
public async Task BatchUpdateAgeAsync()
{
var filter = Builders<User>.Filter.Lt(u => u.Age, 18);
var update = Builders<User>.Update.Inc(u => u.Age, 1);
await _userCollection.UpdateManyAsync(filter, update);
}
}
}
删除数据
删除操作可以根据条件删除单条或多条数据:
using MongoDB.Driver;
using System.Threading.Tasks;
namespace MongoDBDemo
{
public class UserRepository
{
// 省略构造函数等重复代码
// 根据ID删除用户
public async Task DeleteUserByIdAsync(string userId)
{
var filter = Builders<User>.Filter.Eq(u => u.Id, userId);
await _userCollection.DeleteOneAsync(filter);
}
// 删除所有年龄小于16的用户
public async Task DeleteUsersByAgeAsync()
{
var filter = Builders<User>.Filter.Lt(u => u.Age, 16);
await _userCollection.DeleteManyAsync(filter);
}
}
}
注意事项
- 生产环境中连接字符串不要硬编码,建议放在配置文件里,同时如果需要认证要加上用户名密码信息
- 实体类的属性名如果和MongoDB文档字段名不一致,可以使用
[BsonElement]特性指定映射的字段名 - 大量数据查询时建议添加索引提升查询效率,避免全表扫描
- 异步操作要注意异常处理,避免未捕获的异常导致程序崩溃