首页
会员中心
到顶部
到尾部
计算机

工作程序员—使用MongoDB实现NoSQL

时间:2020/10/14 13:38:37  作者:  来源:  查看:0  评论:0
内容摘要: 在过去十多年中,自从2000年发布Microsoft .NET Framework并在2002年首次发布以来,.NET开发人员一直在努力跟上微软抛出的所有新事物。而且,如果这还不够,“社区” - 意味着每天使用.NET的开发人员和那些没有使用.NET的开发人员已经消失,并...

在过去十多年中,自从2000年发布Microsoft .NET Framework并在2002年首次发布以来,.NET开发人员一直在努力跟上微软抛出的所有新事物。而且,如果这还不够,“社区” - 意味着每天使用.NET的开发人员和那些没有使用.NET的开发人员已经消失,并创造了一些更多的东西来填补微软没有的漏洞掩盖 - 或只是为了创造混乱和混乱(你选择)。

其中的一个“新”的东西从社会上出现从Microsoft以外的主持是NoSQL运动,一组开发人员谁公然挑战所有的数据都是思想/会/必须存储在某种形式的关系数据库系统。表,行,列,主键,外键约束和空值上的参数以及主键是自然还是不自然的...不是什么神圣的?

根据MongoDB网站,在本文及其继承人中,我将研究NoSQL运动中主要提供的主要工具之一:MongoDB,其名称来自“hu mongo us”(不,我不是制作)。MongoDB-ish的大部分内容将覆盖:从.NET Framework安装,浏览和使用它,包括提供的LINQ支持; 使用其他环境(桌面应用程序和Web应用程序和服务); 以及如何设置它,以便生产Windows管理员不会刻画您的肖像。

问题(或者,为什么还要关心?)

在深入了解MongoDB的细节之前,请问为什么任何.NET Framework开发人员应该在下一个半小时左右的时间内阅读这篇文章并随身携带笔记本电脑。毕竟,SQL Server提供了一个免费的可重新分发的Express版本,它提供比传统的企业或数据中心绑定的关系数据库更轻的数据存储选项,并且有许多工具和库可用于更容易地访问它包括微软自己的LINQ和实体框架。

问题是关系模型的强度 - 关系模型本身 - 也是它最大的弱点。大多数开发人员,无论是.NET,Java还是其他的东西,只有几年的经验 - 可以在痛苦的细节中描述一切都不能很好地适应表/行/列“平方”模型。尝试建模分层数据可以驱动即使是最有经验的开发人员完全笨蛋,所以Joe Celko写了一本书 - “Smart for Smart SQL第三版”(Morgan-Kaufmann,2005) - 关于建模分层数据的概念在关系模型中。而且,如果你添加了这个基本的“给定”关系数据库假定数据的不灵活的结构 - 数据库模式试图支持数据的临时“附加”变得尴尬。(快,显示手:

NoSQL运动中没有人会建议关系模型没有优势或关系数据库将会消失,但过去二十年的开发人员生活的一个基本事实是开发人员经常将数据存储在关系数据库本质上不是本质上(或有时甚至是远程的)关系。

面向文档的数据库存储“文档”(紧密地编织通常不连接到系统中的其他数据元素的数据的集合)而不是“关系”。例如,博客系统中的博客条目是完全不相连的,即使有人引用另一个,最常见的连接是通过一个超链接,该链接旨在由用户的浏览器而不是在内部解除引用。对该博客条目的评论完全限于该博客条目,很少有用户希望看到所有评论的聚合,无论他们评论的条目如何。

此外,面向文档的数据库往往在高性能或高并发环境方面表现优异; MongoDB特别针对高性能,而CouchDB的一个亲密表现更多地是针对高并发场景。两者都放弃了任何类型的多对象事务支持,这意味着虽然它们支持数据库中单个对象的并发修改,但是一次修改多个对象的任何尝试都会留下一小段时间,这些修改可以在“传递“。文档是以原子方式更新的,但是没有跨越多文档更新的事务的概念。这并不意味着MongoDB没有任何耐久性 - 这仅仅意味着MongoDB实例不会在电源故障以及SQL Server实例中生效。需要完整原子性,一致性,

一般来说,MongoDB对于需要存储可以快速访问并经常使用的数据的应用程序和组件将会很好地工作。网站分析,用户偏好和设置以及数据未完全结构化或需要结构灵活的任何系统都是MongoDB的天然候选者。这并不意味着MongoDB没有完全准备好成为运营数据的主要数据存储库; 这仅仅意味着MongoDB在传统的RDBMS没有的领域以及可以由其中的一些领域工作。

入门

如前所述,MongoDB是一个从MongoDB网站mongodb.com轻松下载的开源软件包。在浏览器中打开网站应该足以找到Windows可下载的二进制包的链接; 看下载链接的页面右侧。或者,如果您喜欢直接链接,请使用mongodb.com/lp/download/mongodb-enterprise。在撰写本文时,稳定版本是1.2.4版本。这只是一个.zip文件包,所以安装它比较简单,比较简单:只需将内容解压即可。

认真。而已。

.zip文件分为三个目录:bin,include和lib。唯一的目录是bin,它包含八个可执行文件。没有其他二进制(或运行时)依赖关系是必需的,事实上,目前只有两个可执行文件是感兴趣的。这些是mongod.exe,MongoDB数据库进程本身,和mongo.exe,命令行shell客户端,通常以与旧的isql.exe SQL Server命令行shell客户端相同的方式使用,以确保事情安装正确和工作; 直接浏览数据; 并执行管理任务。

验证所有正确安装的东西与从命令行客户端启动mongod一样简单。默认情况下,MongoDB希望将数据存储在默认文件系统路径c:\ data \ db中,但这可以通过命令行通过--config通过名称传递的文本文件进行配置。假设一个名为db的子目录存在于mongod将被启动的地方,验证一切都是犹太人的,就像你在图1中看到的那样简单。

工作程序员—使用MongoDB实现NoSQL

图1 启动Mongod.exe以验证成功安装

如果目录不存在,MongoDB将不会创建它。请注意,在我的Windows 7框上,当MongoDB启动时,通常会弹出“此应用程序要打开端口”对话框。确保端口(默认为27017)是可访问的,或者连接到它将是...尴尬,最多。(有关这一点的更多内容,在讨论将MongoDB放入生产环境时)

一旦服务器运行,使用shell连接到它就像微软一样 - mongo.exe应用程序启动一个允许与服务器直接交互的命令行环境,如图2所示。

工作程序员—使用MongoDB实现NoSQL

图2 Mongo.exe启动允许与服务器直接交互的命令行环境

默认情况下,shell连接到“test”数据库。因为这里的目的只是为了验证一切正常工作,测试是好的。当然,从这里可以很容易地创建一些示例数据来与MongoDB一起使用,比如描述一个人的快速对象。如图3所示,这可以快速了解MongoDB如何查看数据进行引导。

工作程序员—使用MongoDB实现NoSQL

图3 创建样本数据

基本上,MongoDB使用JavaScript对象表示法(JSON)作为其数据符号,这解释了其灵活性和客户端与之交互的方式。在内部,MongoDB存储的东西在BSON,一个二进制超集的JSON,更容易的存储和索引。然而,JSON仍然是MongoDB的首选输入/输出格式,通常是MongoDB网站和wiki使用的文档格式。如果你不熟悉JSON,那么在深入MongoDB之前刷好它是一个好主意。同时,只是为了咧嘴笑,对等到mongod存储数据的目录,你会看到几个“测试”命名的文件已经显示出来。

足够的播放时间来编写一些代码。退出shell与输入“退出”一样简单,关闭服务器时,窗口中只需要一个Ctrl + C或关闭它; 服务器捕获关闭信号,并在退出进程之前正确关闭所有内容。

MongoDB的服务器(和shell虽然不是一个问题)被写为一个本地的C ++应用程序 - 记住这些--so访问需要某种.NET Framework驱动程序,它知道如何通过开放的套接字连接到feed它的命令和数据。MongoDB发行版没有与其捆绑的.NET Framework驱动程序,但幸运的是,社区已经提供了一个,其中“社区”在这种情况下是Sam Corder的开发人员,Sam Corder已经构建了一个.NET Framework驱动程序LINQ支持访问MongoDB。他的工作是在源代码和二进制形式都可以,从github.com/samus/mongodb-csharp。下载该页面上的二进制文件(查看右上角)或源代码并进行构建。无论哪种方式,结果是两个程序集:MongoDB.Driver.dll和MongoDB.Linq.dll。

写代码

从根本上说,打开与正在运行的MongoDB服务器的连接与打开连接到任何其他数据库没有太大的区别,如图4所示。

工作程序员—使用MongoDB实现NoSQL

发现早期创建的对象并不难,只是...不同于.NET Framework开发人员之前使用的(见图5)。

工作程序员—使用MongoDB实现NoSQL

如果这看起来有点压倒性,放松 - 它写出了“漫长的路”,因为MongoDB存储的东西与传统数据库不同。

对于初学者,请记住,先前插入的数据有三个字段,它们是firstname,lastname和age,其中任何一个都是可以检索数据的元素。但更重要的是,存储它们的行,相当骑士,被抛出了“test.things.save()” - 这意味着数据被存储在一些名为“东西”的东西中。在MongoDB术语中,“事物”是一个收集,并隐式将所有数据存储在一个集合中。集合反过来保存文档,其中保存键/值对,其中值可以是附加集合。在这种情况下,“事物”是存储在数据库内部的集合,如前所述,它是测试数据库。

因此,获取数据意味着首先连接到MongoDB服务器,然后连接到测试数据库,然后找到集合“东西”。这是图5中的前四行,创建一个表示连接的Mongo对象,连接到服务器,连接到测试数据库,然后获取“东西”集合。

一旦收集返回,代码可以发出一个查询,通过FindOne调用查找单个文档。但是,与所有数据库一样,客户端不想获取集合中的每个文档,然后找到它所感兴趣的文档,但需要限制查询。在MongoDB中,这是通过创建一个包含要在这些字段中搜索的字段和数据的文档完成的,这个概念称为示例查询,或简称为QBE。因为目标是找到包含其值设置为“Neward”的lastname字段的文档,将创建一个包含一个lastname字段及其值的文档,并作为参数传入FindOne。如果查询成功,它返回另一个包含所有数据的文档(再加上一个字段); 否则返回null。

顺便说一句,这个描述的简短版本可以像下面那样简单:

工作程序员—使用MongoDB实现NoSQL

运行时,不仅显示发送的原始值,还会显示一个新的值,一个包含ObjectId对象的_id字段。这是对象的唯一标识符,当存储新数据时,它被数据库静默插入。任何修改此对象的尝试都必须保留该字段,否则数据库将假定它是发送的新对象。通常,这是通过修改查询返回的Document来完成的:

工作程序员—使用MongoDB实现NoSQL

但是,始终可以创建一个新的Document实例,并手动填写_id字段以匹配ObjectId,如果这更有意义:

工作程序员—使用MongoDB实现NoSQL

当然,如果_id是已知的,那么也可以用作查询条件。

请注意,文档实际上是无效的 - 几乎任何东西都可以通过任何名称存储在字段中,包括一些核心的.NET Framework值类型,如DateTime。在技​​术上,如上所述,MongoDB存储BSON数据,其中包括传统JSON类型的一些扩展(字符串,整数,布尔,双精度和空值 - 尽管只允许对象上的空值,而不是在集合中),如前述的ObjectId,二进制数据,正则表达式和嵌入式JavaScript代码。目前,我们将离开后两者,BSON可以存储二进制数据这一事实意味着可以将任何可以减少到字节数组的内容存储起来,这有效地意味着MongoDB可以存储任何东西,尽管它可能不存在能够查询到该二进制Blob。

不死(或完成)然而!

还有更多关于MongoDB的讨论,包括LINQ支持; 做更复杂的服务器端查询超过目前显示的简单的QBE样式查询功能; 并使MongoDB在生产服务器场中幸福地生活。但是现在,这篇文章和IntelliSense的仔细检查应该足以让工作程序员开始。

顺便说一下,如果有一个特定的主题你想看到,请不要犹豫,给我一张纸条。毕竟,它是你的专栏。快乐编码!

  


相关评论
广告联系QQ:45157718 点击这里给我发消息 电话:13516821613 杭州余杭东港路118号雷恩国际科技创新园  网站技术支持:黄菊华互联网工作室 浙ICP备06056032号