猿教程 Logo

.Net连接MongoDb:总结

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

介绍

在上一篇文章中,我们看到了如何为代码中的MongoDb操作设置读写首选项。 我们可以在各个层面设置这些选项:在客户端,数据库或集合级别。 我们也可以直接在连接字符串中指定我们的首选项。

以前的帖子也是这个系列中最后一个致力于MongoDb in .NET的文章。 我们来了很长的路要走,总结一下我们学到的东西。

概要

MongoDb是一个基于文档的数据库,将其数据存储在BSON文档中。 实际上它是编写本系列时最流行的NoSql数据库。 它被广泛的公司用作他们的数据存储。 在.NET项目中存储数据的默认选项通常是SQL Server。 虽然SQL Server可能仍然是.NET开发人员最受欢迎的选择,但他们可以根据其项目需求从其他经过良好测试的替代品中进行选择。 MongoDb很容易设置并开始使用。

它是一种非常灵活的存储机制,缺乏固定的模式,即实际上没有约束。 我们可以在任何集合中存储任何JSON。 MongoDb最重要的优点如下:

  • 具有灵活模式的动态数据结构:您不需要定义列和表。 实际上,您可以在同一集合中存储任何东西

  • 数据迁移变得更加容易。 如果您更改域结构,文档将相应地存储对象。 您可以通过自动更改自定义对象来强制更改模式

  • MongoDb集合可以以比关系数据库更为面向对象的方式表示我们的记录。 对象图可以直接存储在文档中。 如果您从集合中提取单个项目,您将立即获取其关联的对象:订单项目的顺序,摇滚乐队的音乐会,轻松执行对这些链接对象的操作

  • 由于缺少诸如辅助密钥更新和删除项目的约束将更容易,例如, 不需要级联删除

  • 可扩展性:MongoDb具有高度可扩展性。 我们可以轻松地创建具有主节点和辅助节点的数据库集群,以确保我们的数据存储始终可用

  • 免费。 您可以成为付费客户,并从MongoDb获得增强的帮助,但是在规模上安装和使用MongoDb并不会产生任何影响

  • 速度:MongoDb在集合中查询和插入项目非常快速和高效

MongoDb还带来了一些缺点:

  • 缺乏专业工具:使用SQL Server,您可以使用SSMS进行一些非常高级的基于GUI的数据库操作,例如数据库分析,SQL作业,查询编辑器,IntelliSense等等。 MongoDb中没有等价物。

  • MongoDb不支持事务

  • 缺少模式实际上是一个缺点:您无法通过键关联对象,因此无法强制使用“NOT NULL”等规则的强制数据结构。

  • 没有存储过程和触发器

  • MongoDb的MS SQL商业智能工具没有对应的

我们经历的事情

查询

MongoDb具有基于JSON和JavaScript的自己的查询语言。 如果您熟悉这些技术,那么您将很快获取语法。 我们也研究了CRUD操作和聚合。 聚合可以在很多阶段变得相当复杂。 在正确的地方打开和关闭方括号保持语法正确可能是一个挑战。 您最经常通过.NET驱动程序使用数据库,而不是直接在Mongo shell中。 Mongo客户端可以非常适合测试和优化查询和索引,但应用程序所需的大多数后端操作都将通过驱动程序进行。 .NET驱动程序提供了面向对象的数据库交互方式。

具有不同阶段的聚合是MongoDb中非常整洁的功能,可以帮助您开始复杂的数据分析。 聚合也是MongoDb中大数据分析的切入点。 我个人认为,聚合的方式是通过一个阶段将转换的文档传递给下一个阶段的方式,使得它们比其MS SQL等效项更容易使用。

序列化

C#对象可用于在BSON文档和POCO之间进行“翻译”。 我们可以使用Mongo相关属性来装饰C#对象,声明某个属性必须被序列化。 一个例子是BsonElement,我们可以指定JSON中调用的属性,例如 C#地址被序列化为“customer_address”的JSON等价物。 可以论证的是,具有Mongo属性的C#对象是否仍然是一个真正的POCO,可以在域驱动设计中用作纯域对象。 MongoDb属性打破DDD持久化无知的原理。 我将仅使用具体存储库中的那些C#对象作为域对象与其MongoDb集合之间的中间翻译层。 但是,如果您的项目不适合DDD,那么您可以根据需要明确地进行装饰您的POCO对象。

索引

MongoDb是快速高效的,但您的查询可以通过插入必要的索引更快,更高效。 MongoDb以与关系数据库相同的方式提供索引。 我们可以在各个属性,数组字段,文本字段,子文档等中的属性中插入索引。当您尝试找到最佳索引组合时,查询计划是非常有用的工具。 查询计划中最重要的输出是使用的索引的名称,调查的文档数以及返回的文档数。 目标是尽可能少的收集文件。

写的关注

当我们写入数据库时,即插入或更新文档,则新的或更新的文档首先被保存到内存而不是磁盘。 内存中的记录稍后以异步方式持续到磁盘。 滞后不是戏剧性的,它可以是一秒钟,一点点,一点点,取决于内存中有多少数据。 然而,有这个滞后,如果数据库服务器在那个滞后期间死机,那么数据还没有持续到磁盘,并且将从内存中消失。 在服务器重新启动后,它不会神奇地恢复。

默认情况下,当我们向服务器发送写入或更新时,我们得到一个确认信,说明操作是否成功。 如果确认说明OK,那么这意味着新的或更新的文档被持久化到内存中。 新数据也保存在磁盘上并不是100%的保证。 写操作被缩写为“w”,默认值为1,反映了我们刚刚描述的场景,即我们想要对存储器的持久性的确认。 更准确地说,1表示我们想要数据库中一个节点的确认。 如果我们的数据库中有一个节点,那么1是我们可以指定的最高值。 在数据库集群中,也称为副本集,如果要从两个或多个数据库节点获取确认,则可以增加此值,这当然需要更多时间来完成。

插入和更新中的write参数伴随着MongoDb的内存中的另一个部分,称为日志。 日志是一个日志,MongoDb注册从客户端发送给它的所有插入,更新和删除操作。 该杂志也是新文档首先存储在内存中,然后稍后延迟到磁盘的集合。 当服务器崩溃后需要恢复集合时,日志变得重要。 所有在日记中的文档,但不在磁盘上的集合中,将根据日志插入/更新。 但是,如果文档未写入磁盘,并且相关的插入/更新操作尚未持续到磁盘,那么它将永远丢失。 当我们向数据库中插入一个新的文档时,我们不要等待相关日志条目默认保存到磁盘。 持久性选项的日志部分缩写为“j”,默认值为false。

“w”和“j”一起构成写入关注,如上所述,它们的值默认为1,为false。 这就是MongoDb写/更新操作如此之快。 起初我们只写内存,持续到磁盘会以短暂的滞后异步发生。 取而代之的是我们有一个简短的窗口,新的数据可以永远丢失。

“w”参数也可以为0,这意味着所谓的未确认的写入。 那就是我们甚至不等待初始的基于内存的确认。 这是最快的火灾忘记选项。

阅读偏好

当我们建立数据库集群时,阅读偏好会输入图片。 集群由至少3个数据库服务器(节点)组成,其中一个服务器是主节点,另一个服务器是辅助节点。 读取首选项表示群集中要从...读取数据的节点:主节点或其中一个子节点。 如果从辅助节点读取,我们可以从主节点删除一些负载,默认是所有写入操作。 然而,由于从主节点到次节点的数据传播有一个短暂的延迟,从其中一个辅助节点读取可能会返回过时的数据。 有时它不是一个主要的问题。 例如。 如果一个评论出现在博客文章之下,这可能不是一件大事。 但是,我们几乎总是希望确保用户集合中的用户数据始终是最新的。

诊断

我们还简要介绍了MongoDb客户端中内置的一些工具,帮助我们进行数据库分析:

  • 记录慢查询

  • Mongotop

  • Mongostat

这是很多材料要经历,我们还只是涵盖了基础知识。 在现实生活中使用MongoDb项目当然会更具挑战性。 然而,当您使用整洁的测试用例阅读某些技术的教科书时,您几乎总是会遇到这种情况,并尝试将您所学到的知识实现到真正的项目中。

我希望这个系列将帮助您开始在下一个.NET项目中使用MongoDb。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CsharpMongo/44.html