在 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 软件包,它们是:

  1. MongoDB.Bson:独立的 BSON 库,用于处理 POCO 到 BSON 类型(MongoDB 的文件格式)的转换以及反之亦然。
  2. **MongoDB.Driver.Core** \]((http://www.nuget.org/packages/mongodb.driver.core): 这本身就是一个驱动程序,具有驱动程序的核心组件(例如如何连接到`mongod`实例、连接池等),用于从 .Net 到 MongoDB 进行通信,反之亦然,并且依赖于`MongoDB.Bson`。

运行以下命令即可同时安装所有三个包:

Install-Package MongoDB.Driver

访问数据库

要连接数据库,我们使用该类MongoClient访问 mongodb 实例,并通过它选择要使用的数据库。该类有四个构造函数。

  • 默认情况下,无参数构造函数连接到端口 27017 上的实例:

var client = new MongoClient();

  • 接受连接字符串的一个:

var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString);

  • 另一个接受 实例的方法MongoUrl,并且 MongoUrl 类似于使用connectionstringparam 构造函数。您可以使用默认构造函数创建此方法的实例:

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,可以将集合视为表,将文档视为表中的记录。

创建集合

要创建集合,我们使用对象的CreateCollectionCreateCollectionAsyncIMongoDatabase方法。此方法接受三个参数(其中后两个是可选的):

  1. 集合名称
  2. 创建集合选项
  3. 取消标记

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 驱动程序的一些基础知识已经了解,并且知道如何插入文档了。在下一部分中,我们将逐步讲解如何检索文档,以及为此构建查询的各种方法。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
csdn_aspnet8 小时前
在 C# .NETCore 中使用 MongoDB(第 3 部分):跳过、排序、限制和投影
mongodb·c#·.netcore
熊文豪11 小时前
政务系统国产化的“教科书级“实践:MongoDB平滑迁移成功案例解析
数据库·mongodb·政务·kingbasees·金仓数据库
诺青23520 小时前
MongoDB副本集
数据库·mongodb
正在走向自律21 小时前
金仓数据库打通电子证照国产化“最后一公里”——福建某地2TB MongoDB无缝迁移实践
数据库·mongodb·国产数据库·电科金仓
檀越剑指大厂1 天前
平替MongoDB:金仓多模数据库助力电子证照国产化实践
数据库·mongodb
FinTech老王1 天前
一场“无感换心”手术:金仓数据库如何让电子证照系统平滑告别MongoDB
数据库·mongodb
枫叶丹41 天前
金仓数据库替代MongoDB:电子证照系统国产化改造实战
数据库·mongodb
csdn_aspnet1 天前
在 C# .NETCore 中使用 MongoDB(第 2 部分):使用过滤子句检索文档
mongodb·c#·.netcore
A-刘晨阳1 天前
从MongoDB到金仓:一次电子证照系统的平滑国产化升级实践
数据库·mongodb