在当今快节奏的应用程序开发领域,高效的数据存储与管理无疑是构建稳健软件系统的基石。MongoDB 作为一款备受瞩目的 NoSQL 数据库,以其灵活的文档模型、卓越的可扩展性以及出色的性能,在各类项目中得到了广泛应用。而 C# 凭借其强大的功能和丰富的生态系统,成为了众多开发者青睐的编程语言。当 C# 遇上 MongoDB,借助官方提供的 MongoDB 驱动库,两者得以无缝协作,为开发者带来便捷高效的数据处理体验。今天,就让我们一同深入探索 C# 中 MongoDB 库的使用,从基础概念到实际操作,逐步掌握这一强大组合的应用技巧。
MongoDB 基础概念速览
文档(Document):数据的基本单元
MongoDB 以文档形式存储数据,文档本质上是一个有序的键值对集合。与传统关系型数据库中的行相比,它更加灵活,不同文档的结构可以各不相同。例如,一个简单的用户文档可表示为:
{
"name": "John Doe",
"age": 30,
"email": "johndoe@example.com"
}
这种灵活性使得 MongoDB 能够轻松应对多样化的数据存储需求,无论是结构化数据还是半结构化数据。
集合(Collection):文档的容器
集合类似于关系型数据库中的表,是一组文档的集合。集合中的文档无需遵循统一的结构,这使得 MongoDB 在存储各种类型数据时具有极高的适应性。例如,名为 “users” 的集合可容纳不同结构的用户文档,为开发者提供了极大的便利。
数据库(Database):逻辑存储单元
数据库是 MongoDB 存储数据的逻辑容器,一个 MongoDB 实例可包含多个数据库。每个数据库拥有独立的集合和权限控制,确保数据的安全与隔离。
C# 项目接入 MongoDB 的前期准备
安装 MongoDB 驱动库
在 C# 项目中使用 MongoDB,首先需安装官方提供的 MongoDB.Driver 库。借助 NuGet 包管理器,安装过程变得轻松简单。在 Visual Studio 中,右键点击项目,选择 “管理 NuGet 程序包”,在搜索框中输入 “MongoDB.Driver”,随后点击安装即可完成库的引入。
建立与 MongoDB 的连接
安装好驱动库后,下一步便是在代码中建立与 MongoDB 的连接。以下是一个简洁的连接示例:
using MongoDB.Driver;
using System;
class Program
{
static void Main()
{
// 连接字符串
string connectionString = "mongodb://localhost:27017";
// 创建MongoClient对象
MongoClient client = new MongoClient(connectionString);
// 获取数据库
IMongoDatabase database = client.GetDatabase("testdb");
Console.WriteLine("Connected to MongoDB!");
}
}
上述代码中,我们首先定义了连接字符串,指定了 MongoDB 服务器的地址和端口。接着创建了MongoClient对象,通过该对象成功获取到一个数据库实例。这里获取的数据库名为 “testdb”,若该数据库不存在,MongoDB 会在插入数据时自动创建,为开发者省去了手动创建数据库的繁琐步骤。
数据操作实战:增删改查全掌握
插入文档:向集合中添加数据
- 插入单个文档
获取数据库实例后,可进一步获取集合,并向集合中插入文档。以下是插入单个用户文档的示例:
using MongoDB.Bson;
using MongoDB.Driver;
using System;
class Program
{
static void Main()
{
string connectionString = "mongodb://localhost:27017";
MongoClient client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("testdb");
// 获取集合
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("users");
// 创建一个BsonDocument对象表示文档
BsonDocument user = new BsonDocument
{
{ "name", "Alice" },
{ "age", 25 },
{ "email", "alice@example.com" }
};
// 插入文档
collection.InsertOne(user);
Console.WriteLine("Document inserted successfully!");
}
}
在这个例子中,我们先通过数据库实例获取名为 “users” 的集合,然后创建BsonDocument对象来表示要插入的用户文档,最后利用InsertOne方法将文档插入集合。
- 插入多个文档
一次性插入多个文档同样简单,示例如下:
using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
string connectionString = "mongodb://localhost:27017";
MongoClient client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("testdb");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("users");
List<BsonDocument> users = new List<BsonDocument>
{
new BsonDocument
{
{ "name", "Bob" },
{ "age", 35 },
{ "email", "bob@example.com" }
},
new BsonDocument
{
{ "name", "Charlie" },
{ "age", 40 },
{ "email", "charlie@example.com" }
}
};
collection.InsertMany(users);
Console.WriteLine("Multiple documents inserted successfully!");
}
}
这里我们创建了一个BsonDocument对象列表,每个对象代表一个用户文档,然后使用InsertMany方法一次性插入多个文档,大大提高了数据插入的效率。
查询文档:从集合中检索数据
- 基本查询
查询文档是数据库操作中极为常用的操作之一。以下是一个简单的查询示例,用于查询 “users” 集合中年龄大于 30 的用户:
using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Linq;
class Program
{
static void Main()
{
string connectionString = "mongodb://localhost:27017";
MongoClient client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("testdb");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("users");
// 创建查询过滤器
var filter = Builders<BsonDocument>.Filter.Gt("age", 30);
// 执行查询
var result = collection.Find(filter).ToList();
foreach (var document in result)
{
Console.WriteLine(document);
}
}
}
在上述代码中,我们使用Builders<BsonDocument>.Filter创建查询过滤器,通过Gt方法表示 “大于” 条件。接着通过Find方法执行查询,并利用ToList方法将查询结果转换为列表,以便遍历输出。
- 复杂查询
除了基本的比较操作,我们还能进行更复杂的查询,如组合多个条件、使用正则表达式等。以下是一个查询名字以 “J” 开头且年龄小于 40 的用户的示例:
using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Linq;
class Program
{
static void Main()
{
string connectionString = "mongodb://localhost:27017";
MongoClient client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("testdb");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("users");
var filter = Builders<BsonDocument>.Filter.And(
Builders<BsonDocument>.Filter.Regex("name", new BsonRegularExpression("^J")),
Builders<BsonDocument>.Filter.Lt("age", 40)
);
var result = collection.Find(filter).ToList();
foreach (var document in result)
{
Console.WriteLine(document);
}
}
}
在此示例中,我们运用Builders<BsonDocument>.Filter.And方法将两个条件组合起来,一个是使用正则表达式匹配名字以 “J” 开头,另一个是年龄小于 40,从而实现了复杂条件下的精准查询。
更新文档:修改集合中的已有数据
- 更新单个文档
更新文档可对集合中已有的文档进行修改。以下是一个将 “users” 集合中名字为 “Alice” 的用户年龄更新为 26 的示例:
using MongoDB.Bson;
using MongoDB.Driver;
using System;
class Program
{
static void Main()
{
string connectionString = "mongodb://localhost:27017";
MongoClient client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("testdb");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("users");
var filter = Builders<BsonDocument>.Filter.Eq("name", "Alice");
var update = Builders<BsonDocument>.Update.Set("age", 26);
collection.UpdateOne(filter, update);
Console.WriteLine("Document updated successfully!");
}
}
在这个例子中,我们首先创建查询过滤器,用于定位名字为 “Alice” 的文档。然后创建更新操作,借助Set方法将 “age” 字段的值更新为 26,最后通过UpdateOne方法执行更新操作。
- 更新多个文档
若要更新多个符合条件的文档,可使用UpdateMany方法。例如,将 “users” 集合中所有年龄大于 35 的用户年龄增加 1:
using MongoDB.Bson;
using MongoDB.Driver;
using System;
class Program
{
static void Main()
{
string connectionString = "mongodb://localhost:27017";
MongoClient client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("testdb");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("users");
var filter = Builders<BsonDocument>.Filter.Gt("age", 35);
var update = Builders<BsonDocument>.Update.Inc("age", 1);
collection.UpdateMany(filter, update);
Console.WriteLine("Multiple documents updated successfully!");
}
}
这里我们运用Inc方法增加 “age” 字段的值,并通过UpdateMany方法对所有符合条件的文档进行批量更新,极大地提高了数据更新的效率。
删除文档:从集合中移除数据
- 删除单个文档
删除文档也是常见的数据库操作。以下是删除 “users” 集合中名字为 “Bob” 的用户文档的示例:
using MongoDB.Bson;
using MongoDB.Driver;
using System;
class Program
{
static void Main()
{
string connectionString = "mongodb://localhost:27017";
MongoClient client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("testdb");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("users");
var filter = Builders<BsonDocument>.Filter.Eq("name", "Bob");
collection.DeleteOne(filter);
Console.WriteLine("Document deleted successfully!");
}
}
在此示例中,我们创建查询过滤器找到名字为 “Bob” 的文档,然后使用DeleteOne方法将其删除。
- 删除多个文档
若要删除多个符合条件的文档,可使用DeleteMany方法。例如,删除 “users” 集合中所有年龄小于 25 的用户文档:
using MongoDB.Bson;
using MongoDB.Driver;
using System;
class Program
{
static void Main()
{
string connectionString = "mongodb://localhost:27017";
MongoClient client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("testdb");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("users");
var filter = Builders<BsonDocument>.Filter.Lt("age", 25);
collection.DeleteMany(filter);
Console.WriteLine("Multiple documents deleted successfully!");
}
}
这里通过DeleteMany方法,一次性删除所有符合年龄小于 25 条件的文档,实现了批量数据删除操作。
实战案例:构建简单用户管理系统
项目需求剖析
我们的目标是构建一个简单的用户管理系统,该系统需具备用户添加、查询、更新和删除功能。用户信息涵盖姓名、年龄、邮箱和地址。
项目结构设计
创建一个 C# 控制台应用程序项目,项目结构如下:
- Program.cs:作为主程序入口,负责处理用户输入并调用相应的业务逻辑。
- User.cs:用于定义用户类,精确表示用户信息。
- UserService.cs:封装用户相关的数据库操作,包括插入、查询、更新和删除。
代码实现详解
- 定义 User 类
using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; public class User { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } public string Address { get; set; } }
在这个类中,我们使用BsonId和BsonRepresentation特性指定Id字段为 MongoDB 文档的唯一标识,并将其表示为ObjectId类型,确保每个用户文档在数据库中的唯一性。
- 实现 UserService 类
using MongoDB.Driver; using System.Collections.Generic; public class UserService { private readonly IMongoCollection<User> _usersCollection; public UserService(string connectionString, string databaseName, string collectionName) { var client = new MongoClient(connectionString); var database = client.GetDatabase(databaseName); _usersCollection = database.GetCollection<User>(collectionName); } public void AddUser(User user) { _usersCollection.InsertOne(user); } public List<User> GetAllUsers() { return _usersCollection.Find(_ => true).ToList(); } public User GetUserById(string id) { var filter = Builders<User>.Filter.Eq(u => u.Id, id); return _usersCollection.Find(filter).FirstOrDefault(); } public void UpdateUser(User user) { var filter = Builders<User>.Filter.Eq(u => u.Id, user.Id); var update = Builders<User>.Update .Set(u => u.Name, user.Name) .Set(u => u.Age, user.Age) .Set(u => u.Email, user.Email) .Set(u => u.Address, user.Address); _usersCollection.UpdateOne(filter, update); } public void DeleteUser(string id) { var filter = Builders<User>.Filter.Eq(u => u.Id, id); _usersCollection.DeleteOne(filter); } }
在UserService类中,通过构造函数获取 MongoDB 集合。随后实现了添加用户、获取所有用户、根据 Id 获取用户、更新用户和删除用户的方法。这些方法充分利用了 MongoDB 驱动库提供的相应操作,为用户管理系统提供了坚实的数据操作支持。
- 编写 Program.cs
using System; class Program { static void Main() { string connectionString = "mongodb://localhost:27017"; string databaseName = "userdb"; string collectionName = "users"; UserService userService = new UserService(connectionString, databaseName, collectionName); while (true) { Console.WriteLine("1. Add User"); Console.WriteLine("2. Get All Users"); Console.WriteLine("3. Get User by Id"); Console.WriteLine("4. Update User"); Console.WriteLine("5. Delete User"); Console.WriteLine("6. Exit"); Console.Write("Enter your choice: "); string choice = Console.ReadLine(); switch (choice) { case "1": Console.Write("Enter name: "); string name = Console.ReadLine(); Console.Write("Enter age: "); int age = int.Parse(Console.ReadLine()); Console.Write("Enter email: "); string email = Console.ReadLine(); Console.Write("Enter address: "); string address = Console.ReadLine(); User newUser = new User { Name = name, Age = age, Email = email, Address = address }; userService.AddUser(newUser); Console.WriteLine("User added successfully!"); break; case "2": var allUsers = userService.GetAllUsers(); foreach (var user in allUsers) { Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}, Email: {user.Email}, Address: {user.Address}"); } break; case "3": Console.Write("Enter user id: "); string userId = Console.ReadLine(); var userById