在本文中,将探讨如何通过.NET实现MongoDB数据库的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作。MongoDB是一个基于文档的NoSQL数据库,广泛用于存储和管理JSON格式的数据。将使用MongoDB官方提供的.NET驱动程序来实现这些操作。
为了与MongoDB进行交互,需要使用MongoDB团队开发的NuGet包。这些包提供了一系列的预定义类,将利用这些类来与MongoDB进行交互。这些类将负责大部分的开发工作,如打开和关闭连接、维护连接池等,从而使.NET代码更加可读和易于维护。
BSON(Binary JSON)是一种二进制编码的JSON-like文档序列化格式。与JSON一样,BSON支持在其他文档和数组中嵌入文档和数组。以下是关于JSON和BSON的白皮书。
要插入单个文档,可以使用以下代码。在运行此代码之前,请确保MongoDB实例正在运行。还可以更改连接字符串以指向MongoDB服务器。在这里,从MongoDB获取测试数据库,并添加一个BsonDocument
到people
表中。当不知道确切的表集合类型时,可以使用BsonDocument
类型。创建文档后,通过调用InsertOneAsync
方法将其添加到people
集合中。此方法将仅在表中添加一个文档。
static async Task MainAsync(string[] args)
{
var ConnectionString = "mongodb://localhost:27017";
var client = new MongoClient(ConnectionString);
var db = client.GetDatabase("test");
var col = db.GetCollection("people");
var doc = new BsonDocument
{
{ "Name", "test" },
{ "Age", 33 }
};
await col.InsertOneAsync(doc);
}
要添加多个文档,可以使用以下代码。在这里,创建了两个BsonDocuments
并将它们添加到表集合中,使用的是InsertManyAsync
方法。
static async Task MainAsync(string[] args)
{
var ConnectionString = "mongodb://localhost:27017";
var client = new MongoClient(ConnectionString);
var db = client.GetDatabase("test");
var col = db.GetCollection("people");
var doc = new BsonDocument
{
{ "Name", "test" },
{ "Age", 33 }
};
var doc2 = new BsonDocument
{
{ "Name", "Hi" },
{ "Profession", "PM" }
};
await col.InsertManyAsync(new[] { doc, doc2 });
}
除了使用BsonDocument
,还可以添加自己的类类型文档。需要创建一个类,并创建该类类型的文档,然后以类似的方式添加。
可以通过两种方式来实现这一点。第一种方式是使用游标,这是最有效的方法。游标是Mongo驱动程序和服务器之间通信的方式,服务器会以批次的形式将它们发送回来。以下是从people
集合中获取文档的代码。
static async Task MainAsync(string[] args)
{
var ConnectionString = "mongodb://localhost:27017";
var client = new MongoClient(ConnectionString);
var db = client.GetDatabase("test");
var col = db.GetCollection("people");
using (var cursor = await col.Find(new BsonDocument()).ToCursorAsync())
{
while (await cursor.MoveNextAsync())
{
foreach (var doc in cursor.Current)
{
Console.WriteLine(doc);
}
}
}
}
还有一种更简单、更干净、更快的方法来从数据库中检索数据。然而,它会将所有文档保留在内存中,因此可能不适用于某些场景。但是,当知道集合中有一个或几个文档时,它将非常有用。
static async Task MainAsync(string[] args)
{
var ConnectionString = "mongodb://localhost:27017";
var client = new MongoClient(ConnectionString);
var db = client.GetDatabase("test");
var col = db.GetCollection("people");
var list = await col.Find(new BsonDocument()).ToListAsync();
foreach (var doc in list)
{
Console.WriteLine(doc);
}
}
上述两种方法展示了如何从集合中检索所有文档。如果想检索特定文档,可以使用过滤器,所有满足条件的文档都将被返回。有一个构建器助手类可以用来创建过滤器。
这进一步分为两个类别:替换和更新。首先,让看看如何在MongoDB中替换文档。当替换文档时,不能替换ID字段。
static async Task MainAsync(string[] args)
{
var ConnectionString = "mongodb://localhost:27017";
var client = new MongoClient(ConnectionString);
var db = client.GetDatabase("test");
var col = db.GetCollection("people");
await col.ReplaceOneAsync(new BsonDocument("name", "Simon"), new BsonDocument("name", "Juli"));
await col.Find(new BsonDocument()).ForEachAsync(X => Console.WriteLine(X));
}
上述代码将将people集合中的名称从Simon更改为Juli。以下是另一个示例代码,根据条件更新记录。在这里,它将名为Simon的人的年龄增加10岁。
static async Task MainAsync(string[] args)
{
var ConnectionString = "mongodb://localhost:27017";
var client = new MongoClient(ConnectionString);
var db = client.GetDatabase("test");
var col = db.GetCollection("people");
await col.UpdateOneAsync(Builders.Filter.Eq("name", "Simon"), Builders.Update.Inc("Age", 10));
await col.Find(new BsonDocument()).ForEachAsync(X => Console.WriteLine(X));
}
同样,也可以使用方法UpdateManyAsync
来更新多个文档。
从MongoDB中删除记录有两种方法:DeleteManyAsync
和DeleteOneAsync
。顾名思义,一个用于删除单个记录,另一个用于删除多个记录。
await col.DeleteOneAsync(Builders.Filter.Eq("name", "test1"));
注意:在运行上述所有代码之前,MongoDB服务器实例应该正在运行。