使用 C# .NETCore 实现MongoDB
在本文中,我们将使用 .NET 和 C# 在 MongoDB 数据库中实现基本操作。我们将使用 MongoDB.Driver 包执行各种操作。本文重点介绍 MongoDB 操作,因此我们不会为 .NET 项目实现高级架构。相反,我们将创建一个 .NET 8 Web API 项目,并直接在控制器中实现所有操作,而不是创建单独的服务或存储库类。您可以根据自身需求实现这些架构。
示例代码:https://download.csdn.net/download/hefeng_aspnet/91716842
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
什么是 MongoDB?
MongoDB 是一种以易于读取和使用的方式存储信息的数据库。它非常灵活,这意味着它可以处理不同类型的数据,而无需固定的结构。MongoDB 运行速度快,可以同时管理大量信息。它非常适合存储来自网站、应用程序和其他数字来源的数据,因为它旨在处理大量信息,并且可以设置为同时与多台计算机协同工作。
在 .NET 应用程序中配置 MongoDB
要设置 MongoDB 以用于您的 .NET 应用程序,请按照以下步骤操作。
步骤1.安装MongoDB.Driver包
第一步是安装 MongoDB.Driver 包。此包允许你的 .NET 应用程序与 MongoDB 通信。操作方法如下。
- 在 Visual Studio 中打开您的项目。
- 导航到“工具”>“NuGet 包管理器”>“管理解决方案的 NuGet 包”。
- 在“浏览”选项卡中,搜索“MongoDB.Driver”。
- 选择该包并单击“安装”将其添加到您的项目中。
步骤 2.配置 MongoDB 连接详细信息
接下来,您需要配置 MongoDB 客户端以连接到您的 MongoDB 服务器。您需要指定服务器的 URL 和要使用的数据库名称。这些配置信息通常存储在应用程序的设置文件 (appsettings.json) 中。
以下是如何在“appsettings.json”中配置 MongoDB 设置的示例。
{
"MongoDbSettings": {
"ConnectionString": "mongodb://localhost:27017",
"DatabaseName": "MongoWithDotNet",
"Collections": {
"EmployeeCollection": "Employees"
}
}
}
在此配置中
- ConnectionString: 指定 MongoDB 服务器的 URL(`mongodb://localhost:27017` 是本地 MongoDB 实例的默认值)。
- DatabaseName: 指定您要使用的数据库的名称(本例中为“MongoWithDotNet”)。
- 集合: 定义数据库中的集合(此处定义“员工”集合)。
步骤 3.在您的应用程序中注册 MongoDB 客户端
现在,您需要在 .NET 应用程序中注册 MongoDB 客户端。这将允许您的应用程序在其所有组件中使用 MongoDB 服务。通常,此注册在 Program.cs 或 Startup.cs 文件中完成。
下面介绍如何使用依赖注入 (DI) 注册 MongoDB 客户端。
// Register MongoDB client
var connectionString = builder.Configuration.GetValue<string>("MongoDbSettings:ConnectionString");
var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
settings.SslSettings = new SslSettings() { EnabledSslProtocols = SslProtocols.Tls12 };
builder.Services.AddSingleton<IMongoClient>(new MongoClient(settings));
在此代码中
- IMongoClient: 表示与 MongoDB 服务器交互的 MongoDB 客户端接口。
- MongoClientSettings: 配置 MongoDB 客户端的设置,包括连接字符串和 SSL 设置。
- AddSingleton: 将 MongoDB 客户端注册为单例服务,确保在应用程序的整个生命周期内只有一个实例。
按照以下步骤操作,您的 .NET 应用程序即可配置为连接 MongoDB 并与之交互。现在,您可以继续在应用程序中实现 MongoDB 操作,例如插入、查询、更新和删除数据。
了解 MongoDB 数据库操作
我们可以在 C# 代码中执行数据库操作。MongoDB 客户端允许我们执行以下数据库操作。
- 创建收藏夹
- 掉落收藏
- 重命名集合
- 列表集合
- 获取集合(使用 C# 类映射集合)
为了理解这些操作,我们将创建一个新的控制器,在其中执行所有上述操作。我们将直接在控制器中使用 Mongo 客户端,而无需创建任何服务或存储库。
要使用这些数据库操作,我们首先必须创建一个 Mongo 数据库对象的实例。我们将在构造函数中通过从应用程序设置文件中读取数据库名称来创建它。
private readonly IMongoDatabase _database;
public MongoDatabaseController(IMongoClient mongoClient, IConfiguration configuration)
{
var databaseName = configuration.GetValue<string>("MongoDbSettings:DatabaseName");
_database = mongoClient.GetDatabase(databaseName);
}
创建集合
要在 MongoDB 数据库中创建新集合,请使用 IMongoDatabase 接口提供的 CreateCollectionAsync 方法。以下示例演示了它在控制器中的实现。
[HttpPost("create-collection/{name}")]
public async Task<IActionResult> CreateCollection(string name)
{
try
{
await _database.CreateCollectionAsync(name);
return Ok($"Collection '{name}' created successfully.");
}
catch (Exception ex)
{
return StatusCode(500, $"Failed to create collection '{name}'. Error: {ex.Message}");
}
}
显式创建集合允许您提前定义它,尽管 MongoDB 通常会在您插入第一个文档时自动创建集合。这种方法对于使用特定属性(例如验证规则或预定义索引)配置集合非常有益。通过显式定义集合,您可以从一开始就高效地构建数据库,从而增强组织能力并优化性能。
明确创建集合可确保您的 MongoDB 设置从一开始就符合应用程序的需求。这种主动的方法有助于在应用程序扩展时实现更顺畅的数据管理和更高效的查询处理。
删除集合
要从 MongoDB 数据库中删除集合及其所有关联文档,请使用 IMongoDatabase 接口提供的 DropCollectionAsync 方法。以下是控制器中的示例实现。
[HttpDelete("drop-collection/{name}")]
public async Task<IActionResult> DropCollection(string name)
{
try
{
await _database.DropCollectionAsync(name);
return Ok($"Collection '{name}' dropped successfully.");
}
catch (Exception ex)
{
return StatusCode(500, $"Failed to drop collection '{name}'. Error: {ex.Message}");
}
}
删除集合是一项强大的操作,通常用于应用程序开发过程中的清理或重置。它可以有效地从数据库中删除指定的集合及其所有文档。
但是,执行此操作时请务必小心,以免造成意外的数据丢失。在继续执行删除操作之前,请仔细检查并准确指定集合名称。
此方法可确保您的 MongoDB 数据库保持井然有序且精简,从而可以在应用程序发展过程中实现高效的数据管理和维护。
列出收藏品
要获取数据库中所有集合的列表,请使用 ListCollectionNamesAsync 方法。此方法以游标形式返回所有集合的名称,然后您可以将其转换为列表。
[HttpGet("list-collections")]
public async Task<IActionResult> ListCollections()
{
try
{
var cursor = await _database.ListCollectionNamesAsync();
var collectionNames = await cursor.ToListAsync();
return Ok(collectionNames);
}
catch (Exception ex)
{
return StatusCode(500, $"Failed to retrieve collection names. Error: {ex.Message}");
}
}
列出集合有利于动态检查数据库结构,尤其是在需要适应不同集合的应用程序中。通过检索集合名称,您可以以编程方式处理各种集合,从而使您的应用程序更加灵活和健壮。
重命名集合
有时,你可能需要重命名现有集合,这可以使用 RenameCollectionAsync 方法来完成。此方法将集合的名称从旧名称更改为新名称。
[HttpPost("rename-collection/{oldName}/{newName}")]
public async Task<IActionResult> RenameCollection(string oldName, string newName)
{
try
{
await _database.RenameCollectionAsync(oldName, newName);
return Ok($"Collection '{oldName}' renamed to '{newName}' successfully.");
}
catch (Exception ex)
{
return StatusCode(500, $"Failed to rename collection '{oldName}' to '{newName}'. Error: {ex.Message}");
}
}
重命名集合时,现有数据和索引在更改集合名称时保持不变。此操作对于重构或重新组织数据库非常有用,不会丢失任何数据。当您想遵循新的命名约定或提高数据库结构的清晰度时,此操作也很方便。请确保新名称与现有集合不冲突,以避免出现问题。
获取集合
要与特定集合交互,可以使用 GetCollection<T> 方法检索它。此方法返回一个可用于 CRUD 操作的集合对象。
[HttpPost("get-collection/{collectionName}")]
public IActionResult GetCollection(string collectionName)
{
var collection = _database.GetCollection<Employee>(collectionName);
return Ok();
}
使用 GetCollection<T> 检索集合可以执行各种操作,例如插入、更新、查询和删除文档。该方法是泛型的,这意味着您可以指定集合所包含的文档类型(例如,Employee)。这确保了类型安全,并在您的 IDE 中启用了 IntelliSense 支持,从而使您的代码更易于编写和维护。
了解 MongoDB 集合操作
我们将探索一些基本行动,例如,
- 插入: 将新文档添加到集合中。
- 查找: 根据指定条件检索文档。
- 替换: 用更新的数据替换整个文档。
- 更新: 修改现有文档中的特定字段。
- 删除: 从集合中删除文档。
- EstimatedDocumentCount: 快速估计集合中的文档数量。
- CountDocuments: 获取集合中文档的准确数量。
我开发了一个名为 Employee 的新 C# 类,专门用于在控制器中演示这些操作。该类定义了员工文档的结构,包括 ID、姓名、年龄、职位和薪水等字段。这些操作使用 .NET 中的 MongoDB.Driver 包实现,有助于在 MongoDB 集合中实现高效的数据管理和操作。
public class Employee
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Designation { get; set; }
public decimal Salary { get; set; }
}
初始化 MongoDB 集合
public class MongoCollectionController : ControllerBase
{
private readonly IMongoCollection<Employee> _employeeCollection;
public MongoCollectionController(IMongoClient mongoClient, IConfiguration configuration)
{
var databaseName = configuration.GetValue<string>("MongoDbSettings:DatabaseName");
var employeeCollectionName = configuration.GetValue<string>("MongoDbSettings:Collections:EmployeeCollection");
var database = mongoClient.GetDatabase(databaseName);
_employeeCollection = database.GetCollection<Employee>(employeeCollectionName);
}
}
解释
MongoCollectionController 类初始化并管理与名为 Employee 的 MongoDB 集合的交互。在构造函数中。
- 依赖注入: 它接收一个 IMongoClient 实例和 IConfiguration 来连接到 MongoDB 并从 appsettings.json 检索配置详细信息。
- 数据库和集合初始化: 使用 IMongoClient 连接到 MongoDB 服务器并检索指定的数据库(MongoDbSettings: DatabaseName)。然后,使用名为 Employee 的集合(在 MongoDbSettings:Collections: EmployeeCollection 中指定)初始化 _employeeCollection。
通过在 .NET 应用程序中实现这些 MongoDB 集合操作,您可以高效地管理存储在 MongoDB 数据库中的数据。每个操作都利用 MongoDB.Driver 包与 .NET 应用程序无缝集成,为 CRUD 操作和数据操作提供强大的功能。
插入文档
[HttpPost("create")]
public async Task<IActionResult> Create()
{
try
{
var employee = new Employee { Id = ObjectId.GenerateNewId().ToString(), Name = "John Doe", Age = 30 };
await _employeeCollection.InsertOneAsync(employee);
return Ok();
}
catch (MongoWriteException ex)
{
return BadRequest($"Failed to insert document: {ex.Message}");
}
}
解释
- 插入操作: 此方法使用 InsertOneAsync 方法将新的员工文档插入 MongoDB 集合 _employeeCollection。
- ObjectId 生成: ObjectId.GenerateNewId().ToString() 为文档创建唯一标识符,确保每个文档在集合中都有不同的 ID。
- 异常处理: 如果尝试插入具有重复 ID 的文档,则会引发 MongoWriteException。catch 块会处理此异常,并返回包含相应错误消息的 BadRequest 响应。
注意: MongoDB 默认确保 _id 字段的唯一性。如果您尝试插入一个 ID 已存在于集合中的文档,它将抛出 MongoWriteException 异常,并显示一条指示重复键错误的消息。此行为对于维护数据完整性和防止 MongoDB 集合中出现意外重复至关重要。
插入多个文档
[HttpPost("create-many")]
public async Task<IActionResult> CreateMany()
{
var employees = new List<Employee>
{
new Employee { Id = ObjectId.GenerateNewId().ToString(), Name = "Test 1", Age = 25, Designation = "SSE", Salary = 15000 },
new Employee { Id = ObjectId.GenerateNewId().ToString(), Name = "Test 2", Age = 35, Designation = "Team Leader", Salary = 105000 },
new Employee { Id = ObjectId.GenerateNewId().ToString(), Name = "Test 3", Age = 35, Designation = "Test", Salary = 151022},
new Employee { Id = ObjectId.GenerateNewId().ToString(), Name = "Test 4", Age = 35, Designation = "Demo", Salary = 1500}
};
await _employeeCollection.InsertManyAsync(employees);
return Ok();
}
解释
- 批量插入操作: CreateMany 方法使用 InsertManyAsync 将多个 Employee 文档插入 _employeeCollection,该方法针对批量数据插入进行了优化。
- ObjectId 生成: 每个员工文档都会被分配一个唯一的 _id,该 _id 由 ObjectId.GenerateNewId().ToString() 生成。这确保了每个文档在集合中都有唯一的标识符。
InsertMany 的优点
- 效率: 通过一次操作插入多个文档,与单独插入文档相比,减少了开销。
- 原子性: 所有插入要么一起成功,要么一起失败,确保数据完整性。
- 性能: 非常适合在将大批量数据插入 MongoDB 集合时需要高吞吐量和最小延迟的场景。
获取所有文档
使用 Find 从集合中检索所有文档。
[HttpGet("all")]
public async Task<IActionResult> GetAll()
{
var employees = await _employeeCollection.Find(Builders<Employee>.Filter.Empty).ToListAsync();
return Ok(employees);
}
解释
- 使用带有空过滤器 (Builders<Employee>.Filter.Empty) 的 Find 方法从集合中获取所有 Employee 文档。此方法检索所有文档时无需应用任何特定条件,适合获取完整的数据集。
通过 ID 获取文档
使用带有过滤器的“查找”功能,根据文档 ID 检索特定文档。
[HttpGet("get-by-id/{id}")]
public async Task<IActionResult> GetById([FromRoute] string id)
{
var employee = await _employeeCollection
.Find(Builders<Employee>.Filter.Eq(p => p.Id, id))
.FirstOrDefaultAsync();
return Ok(employee);
}
解释
- 使用 Find 方法并结合相等性过滤器 (Builders<Employee>.Filter.Eq(e => e.Id, id)),根据提供的 ID 从集合中检索单个 Employee 文档。此方法能够高效地通过唯一标识符获取文档。
替换整个文档
使用 ReplaceOne 替换整个文档。
[HttpPut("replace/{id}")]
public async Task<IActionResult> Replace([FromRoute] string id)
{
var filter = Builders<Employee>.Filter.Eq(p => p.Id, id);
var employee = new Employee { Id = id, Name = "Updated Name", Age = 40 };
var result = await _employeeCollection.ReplaceOneAsync(filter, employee);
return Ok(result);
}
解释
- 使用 ReplaceOne 将集合中与 ID 匹配的现有 Employee 文档替换为新文档(替换)。此操作适用于使用新数据更新整个文档。
更新文档中的特定字段
使用 UpdateOne 更新文档中的特定字段。
[HttpPatch("update-field/{id}")]
public async Task<IActionResult> UpdateField([FromRoute] string id)
{
var filter = Builders<Employee>.Filter.Eq(p => p.Id, id);
var update = Builders<Employee>.Update.Set(p => p.Name, "Partially Updated Name");
var result = await _employeeCollection.UpdateOneAsync(filter, update);
return Ok(result);
}
解释
- 使用 UpdateOne 方法,根据指定的更新定义 (Builders<Employee>.Update.Set(e => e.Name, "Partially Updated Name")) 更新集合中与 ID 匹配的 Employee 文档的 Name 字段。此方法允许针对文档中的特定字段进行有针对性的更新。
删除文档
使用 DeleteOne 从集合中删除文档。
[HttpDelete("delete/{id}")]
public async Task<IActionResult> Delete([FromRoute] string id)
{
var filter = Builders<Employee>.Filter.Eq(p => p.Id, id);
var result = await _employeeCollection.DeleteOneAsync(filter);
//var result = _employeeCollection.DeleteManyAsync(filter);
return Ok(result);
}
解释
- 使用 DeleteOne 方法从集合中删除与指定 ID 匹配的员工文档。此操作根据文档的唯一标识符删除特定文档。或者,您也可以通过调用 DeleteMany 方法,根据条件删除多条记录。
获取集合中的文档总数
获取文档数量
[HttpGet("count")]
public async Task<IActionResult> CountDocuments()
{
var count = await _employeeCollection.CountDocumentsAsync(Builders<Employee>.Filter.Empty);
return Ok(count);
}
解释
- 使用 CountDocuments 检索集合中员工文档的总数,无需应用任何过滤器 (Builders<Employee>.Filter.Empty)。此方法可准确统计集合中所有文档的数量。
估计数量
[HttpGet("count/estimated")]
public async Task<IActionResult> EstimatedDocumentCount()
{
var count = await _employeeCollection.EstimatedDocumentCountAsync();
return Ok(count);
}
解释
- 使用 EstimatedDocumentCount 检索集合中员工文档的预估数量。此方法无需扫描所有文档即可快速估算集合中的文档数量,从而为大型集合提供更快的响应速度。该数量可能不准确,但有助于快速获取洞察。
- MongoDB 中的 EstimatedDocumentCount 功能可以根据元数据(而非精确计数)快速估算集合中的文档数量。这种估算速度很快,并且对于近似数据洞察就足以满足需求的场景非常有用,例如实时监控或处理大型数据集的应用程序中的性能优化。
- 该方法速度快、效率高,无需扫描所有文档的计算开销,即可快速获得近似值。然而,由于正在进行的数据操作会影响元数据,因此所提供的计数可能并不总是准确的。
结论
通过在 .NET 应用程序中实现 MongoDB 操作,您可以高效地管理存储在 MongoDB 数据库中的数据。这些操作利用 MongoDB.Driver 与 .NET 无缝集成,为数据操作和应用程序开发提供强大的功能。
示例代码:https://download.csdn.net/download/hefeng_aspnet/91716842
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。