MongoDB,被归类为NoSQL数据库,是一个以类JSON格式存储数据的面向文档的数据库系统.MongoDB在底层以名为bson的二进制编码格式表示JSON文档,MongoDB bson实现是轻量级、快速和高度可遍历的。这意味着MongoDB为用户提供了JSON文档的易用性和灵活性,以及轻量级二进制格式的速度和丰富性。其实在我看来在很多场景中MongoDb都可以取代关系型数据库。

作者:依乐祝

原文地址:

在本教程系列中,我将向您展示如何使用.NET驱动程序提供的CRUD函数在.NET应用程序中使用MongoDB。MongoDB驱动允许您使用来自不同编程语言的MongoDB。在本系列教程中,我们将使用C#驱动程序.

准备工作

在开始之前,我们需要打开VisualStudio并创建一个新项目。我将在本教程中使用一个控制台项目。为了演示我们需要安装对应的NuGet包。这里我们需要三个NuGet包,即:

  1. MongoDB.Bson独立的BSON库,它处理POCOS到BSON类型的转换(这是MongoDB的文件格式),反之亦然。
  2. MongoDB.Driver.Core:--它本身就是一个驱动程序,具有驱动程序的核心组件(如如何连接到mongod实例,连接池),用于从.net到MongoDB的通信,并且它依赖于MongoDB.Bson.
  3. MongoDB.Driver*依赖于Driver.Core这反过来又依赖于MongoDB.Bson。它更容易在核心组件驱动程序上使用api,并具有异步方法,并支持Linq.

运行以下命令,会同时安装上面三个包:

  1. Install-Package MongoDB.Driver

访问数据库

若要连接到数据库,请使用MongoClient类访问MongoDB实例,并通过它选择要使用的数据库。这个类有四个构造函数。

  • 默认情况下,连接到端口27017上的实例的无参数结构器:
  1. var client = new MongoClient();
  • 接受连接字符串:
  1. var connectionString = "mongodb://localhost:27017";
  2. var client = new MongoClient(connectionString);
  • 接受一个MongoUrl的实例,而MongoUrl跟使用connectionstring构造函数很类似,您可以通过使用默认构造函数来创建此类实例:
  1. var client = new MongoClient(new MongoUrl("mongodb://localhost:27017"));

.或者使用静态的Create方法:

  1. var client = new MongoClient(MongoUrl.Create("mongodb://localhost:27017"));
  • 最后一个是接受一个MongoClientSettings的构造函数,这里你可以设置很多东西,比如凭据、连接生存期和超时时间等等。下面是两个例子:
  1. var settings1 = MongoClientSettings
  2. .FromUrl(MongoUrl.Create("mongodb://localhost:27017"));
  3. var settings2 = new MongoClientSettings
  4. {
  5. Server = new MongoServerAddress("localhost", 27017),
  6. UseSsl = false
  7. };
  8. var client1 = new MongoClient(settings1);
  9. var client2 = new MongoClient(settings2);

通常,你只需要使用包含一个connectionString参数的构造函数就可以了,我们将在本教程中使用此构造函数。代码如下所示:

  1. using MongoDB.Driver;
  2. using System;
  3. namespace MongoDBDemo
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. Test();
  10. Console.ReadLine();
  11. }
  12. static void Test()
  13. {
  14. var connectionString = "mongodb://localhost:27017";
  15. var client = new MongoClient(connectionString);
  16. }
  17. }
  18. }

使用MongoClient实例,我们可以做很多事情,如删除数据库、获取数据库或检索服务器上的数据库名称列表等。这里没有一个用于创建数据库方法,因为一旦您选择一个数据库并将数据插入其中,它将自动创建数据库。

这里我们使用的是GetDatabase方法,它将自动为我们创建一个数据库。如下所示获取一个名为bookstore 的数据库:

  1. IMongoDatabase db = client.GetDatabase("bookstore");

这个GetDatabase方法返回一个对象,该对象是数据库的表示形式,我们可以从该对象访问不同的集合并操作数据库。这个MongoClient对象是线程安全的,因此您可以将其放在静态字段中,使其成为可以通过DI容器随时获得的Singleton对象,或者使用相同的连接设置实例化一个新的字段(下面将使用相同的连接池);通过这个对象,您可以选择您想要使用的任何数据库。

使用数据库对象,可以从数据库创建、重命名、检索或获取集合列表。文档存储在集合中,如果你对SQL比较熟悉的话,可以将集合视为表,将文档视为表中的记录。

创建一个集合

若要创建集合,我们将使用 IMongoDatabase对象的CreateCollectionCreateCollection Async方法来进行 。该方法接受三个参数(最后两个参数是可选的):

  1. 集合的名称。
  2. 创建集合的选项
  3. 取消令牌
  1. void CreateCollection(
  2. string name,
  3. CreateCollectionOptions options = null,
  4. CancellationToken cancellationToken = default);
  5. Task CreateCollectionAsync(
  6. string name,
  7. CreateCollectionOptions options = null,
  8. CancellationToken cancellationToken = default);

这个CreateCollectionOptions指定集合的特殊设置,例如它应该包含的最大文档数。下面是一个例子:

  1. IMongoDatabase database = client.GetDatabase("bookstore");
  2. await database.CreateCollectionAsync("books", new CreateCollectionOptions
  3. {
  4. Capped=true,
  5. MaxDocuments=100,
  6. });

大多数情况下,我们只需要创建一个集合,并使用默认的创建设置,因此我们只需要传递一个collection的名称即可。

  1. await database.CreateCollectionAsync("books");

创建集合的另一种方法是使用GetCollection它接受集合的名称和集合设置选项作为参数。使用此方法,即使不存在该名称的集合,一旦创建文档,它也会在此之前创建该集合。这通常是您想要的方式,因此这里建议只在你需要创建一个有上限的集合时才使用CREATE进行集合的创建。

Capped集合是一个固定大小的集合,当它达到最大值时,它会自动覆盖其最旧的条目。GetCollection方法是泛型的,在调用此方法时需要指定文档类型。该类型表示要处理的对象/文档的类型。它可以被强类型化为我们定义的任何类,或者使用BsonDocument类型表示一个允许我们处理集合中任何文档形状的动态架构。

获取一个集合

在讨论了创建集合之后,还需要一个额外的步骤来检查集合是否存在,创建它,然后将文档添加到集合中。如果集合不存在,GetCollection会自动创建一个集合,并将文档添加到该集合中。因此,即使有一个CreateCollection,我们通常还是希望使用GetCollection。就像数据库一样,集合也是线程安全的,并且创建起来非常j简单。为了获得一个集合,我们调用GetCollection方法来指定文档类型

  1. static async Task TestAsync()
  2. {
  3. var connectionString = "mongodb://localhost:27017";
  4. var client = new MongoClient(connectionString);
  5. IMongoDatabase database = client.GetDatabase("bookstore");
  6. IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");
  7. }

BsonDocument是来自MongoDB.Bson包的类型,它表示BSON文档,使用这种类型,我们可以处理来自数据库的任何形状的数据。这包含了所有基本BSON类型和其他一些用于使用BSON的方法。

在这个包中,我们有表示BSON类型的类,以及如何在.NET类型和BsonValue之间映射。下面简单列举一些:

  • 我们已经讨论过的BsonDocument类型
  • 表示BSON元素的BsonElement
  • BsonValue是各种子类使用的抽象基类,如BsonString、BsonInt 32等。

这个BsonDocument是字符串到bson值的字典,因此我们可以像初始化字典一样来进行初始化:

  1. var document = new BsonDocument
  2. {
  3. {"bookname", BsonValue.Create(".net core3.1 with mongodb")},
  4. {"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程")},
  5. {"tags", new BsonArray(new[] {".net core", "mongodb"}) },
  6. {"remark", "C#是世界上最好的语言" },
  7. {"publishyear", 2020 }
  8. };

.或者使用Add方法,该方法具有多个重载:

  1. var document2 = new BsonDocument();
  2. document2.Add("bookname", ".net core3.1 with mongodb2");
  3. document2.Add("description", "这是一本关于在.net core3.1中使用mongodb进行开发的教程2");
  4. document2.Add("tags", new BsonArray(new[] { ".net core", "mongodb" }));
  5. document2.Add("remark", "C#是世界上最好的语言");
  6. document2.Add("publishyear", 2020);

.或者使用索引器:

  1. var document3 = new BsonDocument();
  2. document3["bookname"] = ".net core3.1 with mongodb3";
  3. document3["description"] = "这是一本关于在.net core3.1中使用mongodb进行开发的教程3";
  4. document3["tags"] = new BsonArray(new[] { ".net core", "mongodb" });
  5. document3["remark"] = "C#是世界上最好的语言";
  6. document3["publishyear"] = 2020;

创建/插入文档

文档存储在集合中,在查看了创建和获取集合之后,我们将继续在集合中插入新文档。Mongo集合实例提供了一次插入单个文档和一次插入多个文档的方法。

接下来让我们一步一步来进行实现吧:

  • 获取一个IMongocollection类型的对象,该对象表示我们要使用的集合:
  1. IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");
  • 然后创建我们想要插入的文档:
  1. var document = new BsonDocument
  2. {
  3. {"bookname", BsonValue.Create(".net core3.1 with mongodb")},
  4. {"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程")},
  5. {"tags", new BsonArray(new[] {".net core", "mongodb"}) },
  6. {"remark", "C#是世界上最好的语言" },
  7. {"publishyear", 2020 }
  8. };
  • 最后插入该文件:
  1. await collection.InsertOneAsync(document);

要想看到这个效果,让我们开始一个mongod实例,并从控制台监视事件的同时运行以下完整代码:

  1. class Program
  2. {
  3. static async Task Main(string[] args)
  4. {
  5. await TestAsync();
  6. Console.ReadLine();
  7. }
  8. /// <summary>
  9. /// 测试代码
  10. /// </summary>
  11. /// <returns></returns>
  12. static async Task TestAsync()
  13. {
  14. var connectionString = "mongodb://localhost:27017";
  15. var client = new MongoClient(connectionString);
  16. IMongoDatabase database = client.GetDatabase("bookstore");
  17. IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");
  18. var document = new BsonDocument
  19. {
  20. {"bookname", BsonValue.Create(".net core3.1 with mongodb")},
  21. {"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程")},
  22. {"tags", new BsonArray(new[] {".net core", "mongodb"}) },
  23. {"remark", "C#是世界上最好的语言" },
  24. {"publishyear", 2020 }
  25. };
  26. await collection.InsertOneAsync(document);
  27. }
  28. }

...启动你的mongo服务并运行程序,看到如下所示的数据:

这里的InsertOneAsync方法还有一个同步的版本

  1. collection.InsertOne(document);

我们还可以使用InsertManyInsertManyAsync方法进行批量插入。假设我们图书馆又来了三本新书,我们可以使用这个方法同时插入所有的内容,并且它们将被插入到一个批中(假设您使用的是MongoDB2.6或更高版本)。要查看此操作,我们将继续更新代码并运行应用程序:

  1. class Program
  2. {
  3. static async Task Main(string[] args)
  4. {
  5. await TestAsync();
  6. Console.ReadLine();
  7. }
  8. /// <summary>
  9. /// 测试代码
  10. /// </summary>
  11. /// <returns></returns>
  12. static async Task TestAsync()
  13. {
  14. var connectionString = "mongodb://localhost:27017";
  15. var client = new MongoClient(connectionString);
  16. IMongoDatabase database = client.GetDatabase("bookstore");
  17. IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");
  18. await collection.InsertManyAsync(GetBooks());
  19. }
  20. static IEnumerable<BsonDocument> GetBooks() => new List<BsonDocument> {
  21. new BsonDocument
  22. {
  23. {"bookname", BsonValue.Create(".net core3.1 with mongodb1")},
  24. {"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程1")},
  25. {"tags", new BsonArray(new[] {".net core", "mongodb"}) },
  26. {"remark", "C#是世界上最好的语言" },
  27. {"publishyear", 2020 }
  28. },
  29. new BsonDocument
  30. {
  31. {"bookname", BsonValue.Create(".net core3.1 with mongodb2")},
  32. {"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程2")},
  33. {"tags", new BsonArray(new[] {".net core", "mongodb"}) },
  34. {"remark", "C#是世界上最好的语言" },
  35. {"publishyear", 2020 }
  36. },
  37. new BsonDocument
  38. {
  39. {"bookname", BsonValue.Create(".net core3.1 with mongodb2")},
  40. {"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程2")},
  41. {"tags", new BsonArray(new[] {".net core", "mongodb"}) },
  42. {"remark", "C#是世界上最好的语言" },
  43. {"publishyear", 2020 }
  44. },
  45. };
  46. }

这时候我们再进行夏查询,看到所有数据都入库了

除了使用BsonDocument,我们通常预先知道我们想要处理的是什么样的数据,并且我们可以为它们创建自定义的.NET类。遵循我们使用books集合的事例,让我们创建一个Book类并插入使用此类表示的新书籍:

  1. internal class Book
  2. {
  3. public string BookName { get; set; }
  4. public string Description { get; set; }
  5. public IEnumerable<string> Tags { get; set; }
  6. public string Remark { get; set; }
  7. public int PublishYear { get; set; }
  8. }
  9. class Program
  10. {
  11. static async Task Main(string[] args)
  12. {
  13. await TestAsync();
  14. Console.ReadLine();
  15. }
  16. /// <summary>
  17. /// 测试代码
  18. /// </summary>
  19. /// <returns></returns>
  20. static async Task TestAsync()
  21. {
  22. var connectionString = "mongodb://localhost:27017";
  23. var client = new MongoClient(connectionString);
  24. IMongoDatabase database = client.GetDatabase("bookstore");
  25. IMongoCollection<Book> collection = database.GetCollection<Book>("books");
  26. await collection.InsertManyAsync(GetBooks());
  27. }
  28. static IEnumerable<Book> GetBooks() => new List<Book> {
  29. new Book
  30. {
  31. BookName=".net core3.1 with mongodb21",
  32. Description="这是一本关于在.net core3.1中使用mongodb进行开发的教程21",
  33. Tags=new List<string>{ ".net core", "mongodb"},
  34. Remark="C#是世界上最好的语言",
  35. PublishYear=2020,
  36. },
  37. new Book
  38. {
  39. BookName=".net core3.1 with mongodb22",
  40. Description="这是一本关于在.net core3.1中使用mongodb进行开发的教程22",
  41. Tags=new List<string>{ ".net core", "mongodb"},
  42. Remark="C#是世界上最好的语言",
  43. PublishYear=2020,
  44. },
  45. new Book
  46. {
  47. BookName=".net core3.1 with mongodb23",
  48. Description="这是一本关于在.net core3.1中使用mongodb进行开发的教程23",
  49. Tags=new List<string>{ ".net core", "mongodb"},
  50. Remark="C#是世界上最好的语言",
  51. PublishYear=2020,
  52. },
  53. };
  54. }

使用上面的代码,我们可以将集合的文档类型更改为新类,并调用InsertManyAsync方法。运行下程序,然后查询下集合数据如下所示:

总结

通过上面的示例代码的讲解,你应该对如何通过MongoDB .NET 驱动程序来操作MongoDB集合跟文档有所了解了,并且你也应该知道如何进行文档的插入,在下一篇文章中,我将介绍如何对文档进行检索以及为此构建的各种filter及linq查询技巧,有兴趣的可以关注下我的公众号“DotNetCore实战”第一时间进行更新!

参考资料:https://www.codementor.io/@pmbanugo/working-with-mongodb-in-net-1-basics-g4frivcvz

在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入的更多相关文章

  1. 在.NET Core中使用MongoDB明细教程(2):使用Filter语句检索文档

    在上篇文章我们介绍了一些驱动程序相关的基础知识,以及如何将文档插入到集合中.在这篇文章中,我们将学习如何从数据库中检索文档. 作者:依乐祝 译文地址:https://www.cnblogs.com/y ...

  2. 在.NET Core中使用MongoDB明细教程(3):Skip, Sort, Limit, Projections

    到目前为止,我们已经讨论了创建文档, 检索文档,现在让我们来研究一下文档排序,指定要跳过或限制返回的文档数量,以及如何进行投影.此篇文章中的实例代码摘录自原文,未像前几篇文章一样进行实际代码的验证. ...

  3. MongoDB 数据库、集合创建删除与文档插入

    本文章主要介绍mongodb的基本命令,前提条件,你的本地已经安装了mongo. 一.基本命令使用(主要是创建,增删改.) 0.mongoDb统计信息 获得关于MongoDB的服务器统计,需要在Mon ...

  4. 在.Net Core中使用MongoDB的入门教程(二)

    在上一篇文章中,讲到了MongoDB在导入驱动.MongoDB的连接,数据的插入等. 在.Net Core中使用MongoDB的入门教程(一) 本篇文章将接着上篇文章进行介绍MongoDB在.Net ...

  5. 在.Net Core中使用MongoDB的入门教程(一)

    首先,我们在MongoDB的官方文档中看到,MongoDb的2.4以上的For .Net的驱动是支持.Net Core 2.0的. 所以,在我们安装好了MangoDB后,就可以开始MangoDB的.N ...

  6. AppleWatch开发教程之调试程序使用帮助文档

    AppleWatch开发教程之调试程序使用帮助文档 AppleWatch开发教程之调试程序 调试又被称为排错,是发现和减少程序错误的一个过程.在Xcode中进行调试的需要实现以下几个步骤: 1.添加断 ...

  7. MongoDB(7)- 文档插入操作

    插入方法 db.collection.insertOne() 插入单条文档到集合中 db.collection.insertMany() 插入多条文档到集合中 db.collection.insert ...

  8. Asp.Net Core中使用MongoDB的入门教程,控制台程序使用 MongoDB

    内容来源  https://blog.csdn.net/only_yu_yy/article/details/78882446 首先,创建一个.Net Core的控制台应用程序.然后使用NuGet导入 ...

  9. IT兄弟连 HTML5教程 CSS3揭秘 在HTML文档中放置CSS的几种方式

    有很多方法将样式表加入到HTML中,每种方法都有自己的优点和缺点.新的HTML元素和属性已被加入,以允许样式表与HTML文档更简易地组合起来.将样式表加入到HTML中的常用方法有内联样式表.嵌入一张样 ...

随机推荐

  1. Python for循环学习总结笔记

    循环是任何语⾔的⼀个必备要素.同样地,for循环就是Python的⼀个重要组成部分.然而还有⼀些内容是初学者常常忽视的.下面是Python for循环学习总结笔记,一起来查漏补缺吧!         ...

  2. java大数据最全课程学习笔记(6)--MapReduce精通(二)--MapReduce框架原理

    目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages 目录 MapReduce精通(二) MapReduce框架原理 MapReduce工作流程 InputFormat数据 ...

  3. NACOS安装和配置

    安装包nacos-server-1.1.4.tar.gz 环境 JDK1.8 上传及解压 [root@centos7- ~ ]# mkdir -p /cslc/nacos #通过SFTP将安装包上传至 ...

  4. ES数据库重建索引——Reindex(数据迁移)

    应用背景: 1.当你的数据量过大,而你的索引最初创建的分片数量不足,导致数据入库较慢的情况,此时需要扩大分片的数量,此时可以尝试使用Reindex. 2.当数据的mapping需要修改,但是大量的数据 ...

  5. C#怎么统计网站当前在线人数

    1.问题背景 c#网站怎么合理的统计在线人数?我想通过全局变量来统计软件的使用情况,当启动软件时向服务器的用户表写开始使用时间,正常退出时写一个结束使用时间,来统计用户的在线使用情况. 但是有一个问题 ...

  6. plantuml 基本语法(转摘)

    <div id="topics"> <div class="post"> <h1 class="postTitle&qu ...

  7. 安装fiddler 谷歌插件

    移动 .crx 插件无法安装问题 解决方案: 修改后缀名为 .zip 文件 进行解压后,使用浏览器扩展程序加载已解压的文件进行扩展 添加插件 2020-06-20

  8. Python访问字符串中的值

    Python访问字符串中的值: 1.可以使用索引下标进行访问,索引下标从 0 开始: # 使用索引下标进行访问,索引下标从 0 开始 strs = "ABCDEFG" print( ...

  9. P5468 [NOI2019]回家路线 斜率优化 dp

    LINK:回家路线 (文化课 oi 双爆炸 对 没学上的就是我.(我错了不该这么丧的. 不过还能苟住一段时间.当然是去打NOI了 这道题去年同步赛的时候做过.不过这里再次提醒自己要认真仔细的看题目 不 ...

  10. 【NOIP2017】跳房子 题解(单调队列优化线性DP)

    前言:把鸽了1个月的博客补上 ----------------- 题目链接 题目大意:机器人的灵敏性为$d$.每次可以花费$g$个金币来改造机器人,那么机器人向右跳的范围为$[min(d-g,1),m ...