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


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

作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/13493195.html

在本教程系列中,我将向您展示如何使用.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.

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

Install-Package MongoDB.Driver

访问数据库

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

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

var client = new MongoClient();
  • 接受连接字符串:

var connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
  • 接受一个MongoUrl的实例,而MongoUrl跟使用connectionstring构造函数很类似,您可以通过使用默认构造函数来创建此类实例:

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参数的构造函数就可以了,我们将在本教程中使用此构造函数。代码如下所示:

using MongoDB.Driver;
using System;
namespace MongoDBDemo
{class Program{static void Main(string[] args){Test();Console.ReadLine();}static void Test(){var connectionString = "mongodb://localhost:27017";var client = new MongoClient(connectionString);}}
}

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

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

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

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

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

创建一个集合

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

  1. 集合的名称。

  2. 创建集合的选项

  3. 取消令牌

 void CreateCollection(string name,CreateCollectionOptions options = null,CancellationToken cancellationToken = default);Task CreateCollectionAsync(string name,CreateCollectionOptions options = null,CancellationToken cancellationToken = default);

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

 IMongoDatabase database = client.GetDatabase("bookstore");await database.CreateCollectionAsync("books", new CreateCollectionOptions{Capped=true,MaxDocuments=100,});

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

await database.CreateCollectionAsync("books");

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

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

获取一个集合

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

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

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

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

  • 我们已经讨论过的BsonDocument类型

  • 表示BSON元素的BsonElement

  • BsonValue是各种子类使用的抽象基类,如BsonString、BsonInt 32等。

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

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

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

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

.或者使用索引器:

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

创建/插入文档

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

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

  • 获取一个IMongocollection类型的对象,该对象表示我们要使用的集合:

 IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");
  • 然后创建我们想要插入的文档:

 var document = new BsonDocument{{"bookname", BsonValue.Create(".net core3.1 with mongodb")},{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程")},{"tags", new BsonArray(new[] {".net core", "mongodb"}) },{"remark", "C#是世界上最好的语言" },{"publishyear", 2020 }};
  • 最后插入该文件:

await collection.InsertOneAsync(document);

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

class Program{static async Task Main(string[] args){await TestAsync();Console.ReadLine();}/// <summary>/// 测试代码/// </summary>/// <returns></returns>static async Task TestAsync(){var connectionString = "mongodb://localhost:27017";var client = new MongoClient(connectionString);IMongoDatabase database = client.GetDatabase("bookstore");IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");var document = new BsonDocument{{"bookname", BsonValue.Create(".net core3.1 with mongodb")},{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程")},{"tags", new BsonArray(new[] {".net core", "mongodb"}) },{"remark", "C#是世界上最好的语言" },{"publishyear", 2020 }};await collection.InsertOneAsync(document);}}

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


image

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

collection.InsertOne(document);

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

class Program{static async Task Main(string[] args){await TestAsync();Console.ReadLine();}/// <summary>/// 测试代码/// </summary>/// <returns></returns>static async Task TestAsync(){var connectionString = "mongodb://localhost:27017";var client = new MongoClient(connectionString);IMongoDatabase database = client.GetDatabase("bookstore");IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");await collection.InsertManyAsync(GetBooks());}static IEnumerable<BsonDocument> GetBooks() => new List<BsonDocument> {new BsonDocument{{"bookname", BsonValue.Create(".net core3.1 with mongodb1")},{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程1")},{"tags", new BsonArray(new[] {".net core", "mongodb"}) },{"remark", "C#是世界上最好的语言" },{"publishyear", 2020 }},new BsonDocument{{"bookname", BsonValue.Create(".net core3.1 with mongodb2")},{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程2")},{"tags", new BsonArray(new[] {".net core", "mongodb"}) },{"remark", "C#是世界上最好的语言" },{"publishyear", 2020 }},new BsonDocument{{"bookname", BsonValue.Create(".net core3.1 with mongodb2")},{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程2")},{"tags", new BsonArray(new[] {".net core", "mongodb"}) },{"remark", "C#是世界上最好的语言" },{"publishyear", 2020 }},};}

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


1597204359324.png

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

internal class Book
{public string BookName { get; set; }public string Description { get; set; }public IEnumerable<string> Tags { get; set; }public string Remark { get; set; }public int PublishYear { get; set; }
}
class Program{static async Task Main(string[] args){await TestAsync();Console.ReadLine();}/// <summary>/// 测试代码/// </summary>/// <returns></returns>static async Task TestAsync(){var connectionString = "mongodb://localhost:27017";var client = new MongoClient(connectionString);IMongoDatabase database = client.GetDatabase("bookstore");IMongoCollection<Book> collection = database.GetCollection<Book>("books");await collection.InsertManyAsync(GetBooks());}static IEnumerable<Book> GetBooks() => new List<Book> {new Book{BookName=".net core3.1 with mongodb21",Description="这是一本关于在.net core3.1中使用mongodb进行开发的教程21",Tags=new List<string>{ ".net core", "mongodb"},Remark="C#是世界上最好的语言",PublishYear=2020,},new Book{BookName=".net core3.1 with mongodb22",Description="这是一本关于在.net core3.1中使用mongodb进行开发的教程22",Tags=new List<string>{ ".net core", "mongodb"},Remark="C#是世界上最好的语言",PublishYear=2020,},new Book{BookName=".net core3.1 with mongodb23",Description="这是一本关于在.net core3.1中使用mongodb进行开发的教程23",Tags=new List<string>{ ".net core", "mongodb"},Remark="C#是世界上最好的语言",PublishYear=2020,},};}

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


image

总结

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

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

往期精彩回顾

【推荐】.NET Core开发实战视频课程 ★★★

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

【.NET Core微服务实战-统一身份认证】开篇及目录索引

Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

10个小技巧助您写出高性能的ASP.NET Core代码

用abp vNext快速开发Quartz.NET定时任务管理界面

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

现身说法:实际业务出发分析百亿数据量下的多表查询优化

关于C#异步编程你应该了解的几点建议

C#异步编程看这篇就够了

给我好看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10-2 5-2 查询至少生产两种不同的计算机(PC或便携式电脑)且机器速度至少为133的厂商 (20 分)(思路加详解+测试用例)

一&#xff1a;题目 本题目要求编写SQL语句&#xff0c; 查询至少生产两种不同型号的计算机(PC或便携式电脑)且机器速度至少为133的厂商&#xff0c;输出结果按照制造商升序排列。 提示&#xff1a; 本题有三种情况: &#xff08;1&#xff09; 至少生产两种不同PC的厂商 &a…

ASP.NET Core学习资源汇总

ASP.NET Core入门学习资源汇总篇幅比較長&#xff0c;分为七个部分。&#xff08;一&#xff09;认识.NET Core&#xff08;二&#xff09;Vistual Studio安装、调试&#xff08;三&#xff09;Asp.Net Core入门指南与学习路线&#xff08;四&#xff09;入门级实战项目手册、官…

用计算机探索 按一定规律排列,探索规律练习题1

探索规律练习题1、我们平常用的数是十进制数&#xff0c;如26392103610231019100&#xff0c;表示十进制的数要用10个数码(又叫数字)&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9。在…

简单快速导出word文档

最近&#xff0c;我写公司项目word导出功能&#xff0c;应该只有2小时的工作量&#xff0c;却被硬生生的拉长2天&#xff0c;项目上线到业务正常运行也被拉长到2个星期。为什么如此浪费时间呢&#xff1f;1&#xff09;公司的项目比较老&#xff0c;采用硬编码模式&#xff0c;…

如何让多端口网站用一个nginx进行反向代理实际场景分析

前段时间公司要整合服务器资源&#xff0c;刚好趁这次机会将这些乱七八糟的服务器做一次梳理和整合&#xff0c;断断续续一个月迁移完成大概优化掉了1/3的机器&#xff0c;完成之后遇到了一些问题&#xff0c;比如曾今零零散散部署在生产上一些可视化UI&#xff1a;apollo&…

【Azure Show】|第五期(下)当下最火热的Blazor与App Service, 嘉宾闫晓迪Alan Tsai...

欢迎来到Azure Show!Azure Show欢迎来到Azure Show第五期&#xff08;下&#xff09;&#xff0c;继上集分享彭爱华和阿法兔两位老师的跨界经验之后&#xff0c;本期我们【MVP面对面】栏目邀请到远在新西兰的微软最有价值专家闫晓迪和大家聊聊新西兰的技术生态&#xff0c;当然…

台式计算机听音乐,配置一台4000元的台式电脑,主要用于日常办公及上网查资料,听音乐,看电影及学习....

满意答案asshnjgs2014.04.02采纳率&#xff1a;44% 等级&#xff1a;9已帮助&#xff1a;861人CPU&#xff1a;Intel 赛扬D341 2.93G(散) CPU适用类型:台式CPU CPU内核:Prescott 主频(MHz):2930MHz 插槽类型:Socket 775 制作工艺(微米):0.09 微米 L2缓存(KB):256KB FSB(MHz)…

ASP.NET Core Blazor Webassembly 之 组件

关于组件现在前端几大轮子全面组件化。组件让我们可以对常用的功能进行封装&#xff0c;以便复用。组件这东西对于搞.NET的同学其实并不陌生&#xff0c;以前ASP.NET WebForm的用户控件其实也是一种组件。它封装html代码&#xff0c;封装业务逻辑&#xff0c;对外提供属性事件等…

122. 买卖股票的最佳时机 II008(贪心算法+思路)

一&#xff1a;题目 给定一个数组 prices &#xff0c;其中 prices[i] 是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xf…

广东省计算机应用考试题,广东省计算机等级考试一级试题

广东省计算机等级考试一级试题一、理论部分 (共20分&#xff0c;每空1分)将正确答案填写在考试文件夹中“第一题答案.XLS”的Sheet1相应的位置上1. 解释程序的功能是 ( )。A解释执行高级语言源程序 B将高级语言源程序翻译成目标程序C解释执行汇编语言源程序 D将汇编语言源程序翻…

麒麟系统兼容安卓生态 弥补生态短板

日前&#xff0c;麒麟软件发布了银河麒麟操作系统最新版本V10。据媒体报道&#xff0c;麒麟软件是国内唯一一个通过CMMI5级质量评估的操作系统企业&#xff0c;在XC市场份额占有率达到70%以上。麒麟V10系统可以兼容安卓生态。集成了自研的UKUI桌面环境&#xff0c;支持多壁纸、…

763. 划分字母区间009(贪心算法+思路+详解+图示)

一&#xff1a;题目&#xff1a; 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 示例&#xff1a; 输入&#xff1a;S "ababcbacadefegdehijhklij" 输出…

初识ABP vNext(4):vue用户登录菜单权限

点击上方蓝字"小黑在哪里"关注我吧登录菜单权限运行测试前言上一篇已经创建好了前后端项目&#xff0c;本篇开始编码部分。开始几乎所有的系统都绕不开登录功能&#xff0c;那么就从登录开始&#xff0c;完成用户登录以及用户菜单权限控制。登录首先用户输入账号密码…

满汉楼(德鲁伊连接池+DBUtils+DAO+Mysql)保姆级别分析+代码实现

一&#xff1a;需求 1.完成一个酒店后台管理系统&#xff0c;当然只是模拟&#xff0c;在控制台就行模拟 2.实现管理人员的登录和酒店成本账单的查看&#xff0c;以及正常的点餐&#xff0c;结账和查看账单等等功能 二&#xff1a;实现的功能展示 1.用户登录&#xff08;这里…

[Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本

&#xfeff;写在前面很多neter都有在用Ocelot做Api网关&#xff0c;但是Ocelot又不像kong或者其他网关一样&#xff0c;开箱即用。它需要你单独开一个web项目来部署&#xff0c;这样很多同学都在做重复的事了。这里[Hei.Ocelot.ApiGateway] 就把这件事给做了&#xff0c;以后有…

聊聊常见的服务(接口)认证授权

&#xfeff;写在前面头发掉得多了&#xff0c;总有机会接触/调到各种各样的接口&#xff0c;各种面向Api编程实际上已经嵌入到我们的习惯中&#xff0c;没办法现在服务端通信还得是http(s)&#xff0c;其他协议还未能成为通用的。大厂的开发平台api我先不敢说&#xff0c;各种…

二分查找(划分时左右元素个数不相等)解析+代码

一:问题描述 当我们在用二分法查找元素的时候&#xff0c;我们往往特希望遇到是奇数个元素个数的数组&#xff0c;因为划分完左右两边的个数相等&#xff0c;所以在以前刚学二分法的时候就有这个疑问&#xff0c;当时就是模模糊糊过去了&#xff0c;再遇到其实还是会有疑问。现…

网络计算机室电源线怎么布,网吧综合布线(电源和网络)经验谈

电源系统布线篇网吧目前所提供的服务&#xff0c;像网页浏览、网络游戏、在线电影、远程教育等最基本的服务都与网络有关&#xff0c;网络质量的好坏直接决定了网吧的生存能力。所以&#xff0c;如何规划一个优质的网络环境&#xff0c;是网吧经营者必须要考虑的一个要点&#…

69. Sqrt(x)010(二分法求解+详解注释)

一&#xff1a;题目 ‘给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0…

计算机网络 哪个教材好,学习计算机网络哪本教材最好?

benxiuxian高分答主12-29TA获得超过8057个赞地理期末复习计划临近期末&#xff0c;为帮助学生理顺知识&#xff0c;培养学生灵活运用知识分析问题&#xff0c;解决问题的能力&#xff0c;形成完整的知识体系&#xff0c;特作复习计划如下&#xff1a;一、复习目的&#xff1a;1…