在 C# .NETCore 中使用 MongoDB(第 1 部分):驱动程序基础知识和插入文档
MongoDB 属于NoSQL数据库,是一个面向文档的数据库系统,以类似 JSON 的格式存储数据。MongoDB 在后台以二进制编码格式(称为 BSON)表示 JSON 文档,而 MongoDB 的 BSON 实现轻量级、快速且高度可遍历。这意味着 MongoDB 为用户提供了 JSON 文档的易用性和灵活性,以及轻量级二进制格式的速度和丰富性。
在本系列教程中,我将向您展示如何使用 .Net 驱动程序提供的 CRUD 函数在 .Net 应用程序中使用 MongoDB。MongoDB驱动程序允许您使用不同的编程语言来操作 MongoDB。在本系列教程中,我们将使用C# 驱动程序。
在 C# .NETCore 中使用 MongoDB(第 1 部分):驱动程序基础知识和插入文档:
https://blog.csdn.net/hefeng_aspnet/article/details/150556600
在 C# .NETCore 中使用 MongoDB(第 2 部分):使用过滤子句检索文档:
https://blog.csdn.net/hefeng_aspnet/article/details/150557025
在 C# .NETCore 中使用 MongoDB(第 3 部分):跳过、排序、限制和投影:
https://blog.csdn.net/hefeng_aspnet/article/details/150557338
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
入门
首先,启动Visual Studio并创建一个新项目。本教程中我将使用控制台项目。要安装驱动程序,我们将使用 NuGet 并下载所需的软件包。需要三个 NuGet 软件包,它们是:
- MongoDB.Bson:独立的 BSON 库,用于处理 POCO 到 BSON 类型(MongoDB 的文件格式)的转换以及反之亦然。
- [ MongoDB.Driver.Core ]((http://www.nuget.org/packages/mongodb.driver.core): 这本身就是一个驱动程序,具有驱动程序的核心组件(例如如何连接到
mongod
实例、连接池等),用于从 .Net 到 MongoDB 进行通信,反之亦然,并且依赖于MongoDB.Bson
。 - MongoDB.Driver:依赖于
Driver.Core
,而 又依赖于MongoDB.Bson
。它比核心组件驱动程序更易于使用 API,并且具有异步方法并支持使用LINQ进行查询。
运行以下命令即可同时安装所有三个包:
Install-Package MongoDB.Driver
访问数据库
要连接数据库,我们使用该类MongoClient
访问 mongodb 实例,并通过它选择要使用的数据库。该类有四个构造函数。
- 默认情况下,无参数构造函数连接到端口 27017 上的实例:
var client = new MongoClient();
- 接受连接字符串的一个:
var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString);
- 另一个接受 实例的方法MongoUrl,并且 MongoUrl 类似于使用
connectionstring
param 构造函数。您可以使用默认构造函数创建此方法的实例:
var client = new MongoClient(new MongoUrl("mongodb://localhost:27017"));
Create
...或者使用类中的静态方法:
var client = new MongoClient(MongoUrl.Create("mongodb://localhost:27017"));
- 还有一个接受
MongoClientSettings
实例的构造函数。您可以在这里设置许多内容,例如凭据、连接生命周期和超时等等。以下是示例:
var settings1 = MongoClientSettings
.FromUrl(MongoUrl.Create("mongodb://localhost:27017"));
var settings2 = new MongoClientSettings
{
Server = new MongoServerAddress("localhost", 27017),
UseSsl = false
};
var client1 = new MongoClient(settings1);
var client2 = new MongoClient(settings2);
通常情况下,你会使用一个带connectionString
参数的构造函数,本教程中我们也将使用它。我将在该Main
方法中添加一个异步方法,因为我们将使用驱动程序中的异步方法。如果你正在编写代码,请将以下代码添加到你的Program.cs
文件中:
using MongoDB.Driver;
using System;
using System.Threading.Tasks;
namespace WorkingWithMongoDB
{
class Program
{
static void Main(string[] args)
{
MainAsync().Wait();
Console.ReadLine();
}
static async Task MainAsync()
{
var connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
}
}
}
现在运行该应用程序并查看它是否成功连接到该端口上的 mongodb 实例;并且从控制台中,您可以看到打开了多少个连接。
使用 MongoClient 实例,我们可以执行一些操作,例如删除数据库、获取数据库或检索服务器上数据库的名称。无需创建数据库,因为一旦您选择一个数据库并向其中插入数据,它就会自动创建数据库。
我们感兴趣的是GetDatabase
自动创建数据库的方法。因此,我们先获取一个需要school
用到的数据库:
IMongoDatabase db = client.GetDatabase("school");
GetDatabase方法返回一个表示数据库的对象,我们可以从中访问不同的集合并操作数据库。该MongoClient
对象是线程安全的,因此您可以将其放入静态字段中,使其成为一个可以随时通过 DI 容器获取的单例,或者使用相同的连接设置实例化一个新的单例(底层将使用相同的连接池);通过这个对象,您可以选择任何想要使用的数据库。我个人确实将它作为一个单例注册到我选择的 DI 容器中。
使用数据库对象,您可以创建、重命名、检索或从数据库中获取集合列表。文档存储在集合中,因此如果您熟悉 SQL,可以将集合视为表,将文档视为表中的记录。
创建集合
要创建集合,我们使用对象的CreateCollection或CreateCollectionAsyncIMongoDatabase
方法。此方法接受三个参数(其中后两个是可选的):
- 集合名称
- 创建集合选项
- 取消标记
void CreateCollection(
string name,
CreateCollectionOptions options = null,
CancellationToken cancellationToken = null
)
Task CreateCollectionAsync(
string name,
CreateCollectionOptions options = null,
CancellationToken cancellationToken = null
)
CreateCollectionOptions指定集合的设置,例如,它应包含的最大文档数量。以下是示例:
await db.CreateCollectionAsync("students", new CreateCollectionOptions
{
AutoIndexId = false,
MaxDocuments = 25,
Capped = true
});
大多数时候,我们只想创建一个集合并将选项保留为默认值,只需设置name
该集合即可。
await db.CreateCollectionAsync("students");
另一种创建集合的方法是使用GetCollection函数,它接受集合名称和选项集合设置作为参数。使用此方法,即使不存在同名集合,也会在创建文档后立即创建该集合。这通常是您想要的方式,并且仅在需要创建上限集合时才使用创建变体。
固定大小的集合是指当达到最大大小时,会自动覆盖最旧的条目。GetCollection 方法是泛型的,调用此方法时需要指定文档类型。该类型表示我们要处理的对象/文档的类型。它可以是我们定义的任何类的强类型,也可以使用该BsonDocument
类型表示动态模式,从而允许我们使用集合中的任何文档形状。
获取集合
前面讨论过创建集合,它需要一个额外的步骤来检查集合是否存在,创建它,然后将文档添加到集合中。GetCollection
如果不存在,它会自动创建一个集合并将文档添加到该集合中。因此,即使存在CreateCollection
,我们通常也希望采用这种方式。与数据库一样,集合也是线程安全的,并且创建成本很低。要获取集合,我们调用GetCollection
指定文档类型的方法
static async Task MainAsync()
{
......
IMongoCollection<BsonDocument> collection = db.GetCollection<BsonDocument>("students");
}
BsonDocument是 MongoDB.Bson 包中的一个类型,它表示一个 BSON 文档。通过这种类型,我们可以处理数据库中任意类型的数据。该包包含所有基本的 BSON 类型以及一些其他用于处理 BSON 的内容。
在这个包中,我们有一些类用于表示 BSON 类型以及如何在 .NET 类型和 BsonValues 之间进行映射。其中一些是:
- 我们讨论过的 BsonDocument 类型
- BsonElement 表示一个 BSON 元素
- BsonValue 是一个抽象基类,被各种子类(如 BsonString、BsonInt32 等)使用。
这BsonDocument
是一个字符串到 BSON 值的字典,因此我们可以像初始化任何字典一样进行初始化:
var document = new BsonDocument
{
{"firstname", BsonValue.Create("Peter")},
{"lastname", new BsonString("Mbanugo")},
{ "subjects", new BsonArray(new[] {"English", "Mathematics", "Physics"}) },
{ "class", "JSS 3" },
{ "age", int.MaxValue }
};
...或者使用Add
具有多个重载的方法:
var document = new BsonDocument();
document.Add("name", "Steven Johnson");
document.Add("age", 23);
document.Add("subjects", new BsonArray() {"English", "Mathematics", "Physics"});
...或者使用索引器:
document["class"] = "JSS 3";
创建/插入文档
文档存储在集合中。在了解了如何创建和获取集合之后,我们将继续学习如何在集合中插入新文档。Mongo 集合实例提供了一次性插入单个文档或一次性插入多个文档的方法。
为此,我们必须:
- 获取代表
IMongocollection
我们想要处理的集合类型的对象:
var collection = db.GetCollection<BsonDocument>("students");
- 然后创建我们想要的文档:
var document = new BsonDocument
{
{"firstname", BsonValue.Create("Peter")},
{"lastname", new BsonString("Mbanugo")},
{ "subjects", new BsonArray(new[] {"English", "Mathematics", "Physics"}) },
{ "class", "JSS 3" },
{ "age", 45}
};
- 最后插入文档:
await collection.InsertOneAsync(document);
为了验证其工作原理,让我们mongod
从命令行启动一个实例,并运行以下代码行,同时监视控制台中的事件:
class Program
{
static void Main(string[] args)
{
MainAsync().Wait();
Console.ReadLine();
}
static async Task MainAsync()
{
var client = new MongoClient();
IMongoDatabase db = client.GetDatabase("school");
var collection = db.GetCollection<BsonDocument>("students");
var document = new BsonDocument
{
{"firstname", BsonValue.Create("Peter")},
{"lastname", new BsonString("Mbanugo")},
{ "subjects", new BsonArray(new[] {"English", "Mathematics", "Physics"}) },
{ "class", "JSS 3" },
{ "age", 23 }
};
await collection.InsertOneAsync(document);
}
}
...启动 mongod 实例:
运行应用程序并观察控制台:
你会注意到它调用了插入命令并成功插入了一个文档(ninserted: 1
)。此外,此方法还有一个同步版本:
collection.InsertOne(document);
InsertMany
我们还可以使用或方法同时插入多个文档InsertManyAsync
。假设学校来了三名新生,我们可以使用此方法同时插入所有文档,并且它们将合并到一批数据中(假设您使用的是 MongoDB 2.6 或更高版本)。为了演示此操作,我们继续更新代码库并运行应用程序:
class Program
{
static void Main(string[] args)
{
MainAsync().Wait();
Console.WriteLine("Press enter to exit");
Console.ReadLine();
}
static async Task MainAsync()
{
var client = new MongoClient();
IMongoDatabase db = client.GetDatabase("schoool");
var collection = db.GetCollection<BsonDocument>("students");
var newStudents = CreateNewStudents();
await collection.InsertManyAsync(newStudents);
}
private static IEnumerable<BsonDocument> CreateNewStudents()
{
var student1 = new BsonDocument
{
{"firstname", "Ugo"},
{"lastname", "Damian"},
{"subjects", new BsonArray {"English", "Mathematics", "Physics", "Biology"}},
{"class", "JSS 3"},
{"age", 23}
};
var student2 = new BsonDocument
{
{"firstname", "Julie"},
{"lastname", "Lerman"},
{"subjects", new BsonArray {"English", "Mathematics", "Spanish"}},
{"class", "JSS 3"},
{"age", 23}
};
var student3 = new BsonDocument
{
{"firstname", "Julie"},
{"lastname", "Lerman"},
{"subjects", new BsonArray {"English", "Mathematics", "Physics", "Chemistry"}},
{"class", "JSS 1"},
{"age", 25}
};
var newStudents = new List<BsonDocument>();
newStudents.Add(student1);
newStudents.Add(student2);
newStudents.Add(student3);
return newStudents;
}
}
从控制台中,您可以看到它向三个文档发出了插入命令,并成功插入了所有文档。除了使用之外BsonDocument
,我们通常事先知道要处理哪种类型的数据,并且可以为它们创建自定义的 .Net 类。按照我们使用集合的示例students
,让我们创建一个Student
类,并插入使用此类表示的新学生:
internal class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Class { get; set; }
public int Age { get; set; }
public IEnumerable<string> Subjects { get; set; }
}
class Program
{
static void Main(string[] args)
{
MainAsync().Wait();
Console.WriteLine("Press enter to exit");
Console.ReadLine();
}
static async Task MainAsync()
{
var client = new MongoClient();
IMongoDatabase db = client.GetDatabase("schoool");
var collection = db.GetCollection<Student>("students");
var newStudents = CreateNewStudents();
await collection.InsertManyAsync(newStudents);
}
private static IEnumerable<Student> CreateNewStudents()
{
var student1 = new Student
{
FirstName= "Gregor",
LastName= "Felix",
Subjects = new List<string>() {"English", "Mathematics", "Physics", "Biology"},
Class = "JSS 3",
Age = 23
};
var student2 = new Student
{
FirstName = "Machiko",
LastName = "Elkberg",
Subjects = new List<string> {"English", "Mathematics", "Spanish"},
Class = "JSS 3",
Age = 23
};
var student3 = new Student
{
FirstName = "Julie",
LastName = "Sandal",
Subjects = new List<string> {"English", "Mathematics", "Physics", "Chemistry"},
Class = "JSS 1",
Age = 25
};
var newStudents = new List<Student> {student1, student2, student3};
return newStudents;
}
}
使用上面的代码,我们可以将集合的文档类型更改为新类,并调用 insert 方法。为了验证其是否有效,让我们运行应用程序并从控制台监视发生了什么。
总结
由此可见,它确实插入了文档。看完这些,我希望大家对 .Net 驱动程序的一些基础知识已经了解,并且知道如何插入文档了。在下一部分中,我们将逐步讲解如何检索文档,以及为此构建查询的各种方法。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。