当前位置: 首页 > news >正文

在 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
  3. 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 类似于使用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,可以将集合视为表,将文档视为表中的记录。

创建集合

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

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

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

http://www.dtcms.com/a/406514.html

相关文章:

  • php做图片交互网站代码网站下要加个备案号 怎么做
  • 巴中商城网站建设wordpress 图书主题
  • 一键预约上门服务:到家洗车小程序的便捷功能与场景化体验
  • 第 3 篇:让图形动起来 - WebGL 2D 变换
  • 寝室快修|基于SprinBoot+vue的贵工程寝室快修小程序(源码+数据库+文档)
  • 青秀网站建设网站海外推广平台
  • 前端基础:从0到1实现简单网页效果(二)
  • 基于LazyLLM搭建AI创意文案生成器(多场景文案自动生成)
  • 数据链路层:网络通信的基础与桥梁
  • Keepalived两个集群实验
  • vs网站开发表格大小设置网站建设要注意一些什么
  • js网站模板下载做网站和app哪个难
  • MySQL多实例管理
  • 用dpdk实现udp、tcp数据包收发,tcp协议栈相关原理
  • 3D气象数据可视化:使用前端框架实现动态天气展示
  • 学习日记19:GRAPH-BERT
  • shell编程:sed - 流编辑器(5)
  • 网站制作地点中山网站建设公司哪家好
  • 关于【机器人小脑】的快速入门介绍
  • 无线收发模块保障砂芯库桁架机器人稳定无线通信实践
  • 北京有哪些网站建设国家企业信用信息系统(全国)
  • LabVIEW 动态信号分析
  • 腾讯云容器服务
  • 怎么做网站推广电话广西网站建设哪家有
  • 实战:基于 BRPC+Etcd 打造轻量级 RPC 服务——高级特性与生产环境深度实践
  • 蓝耘MaaS驱动PandaWiki:零基础搭建AI智能知识库完整指南
  • C语言,结构体
  • [创业之路-599]:193nm、266nm、355nm深紫外激光器的上下游产业链和相应的国产化公司
  • 安溪住房和城乡规划建设局网站wordpress+左侧菜单
  • Ubuntu 系统中防火墙