MongoDB入门经典(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-28 15:08:49

点击下载

作者:[美]布拉德 戴利(Brad Dayley)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

MongoDB入门经典

MongoDB入门经典试读:

内容提要

MongoDB是目前非常流行的一种非关系型数据库(NoSQL),因其操作简单、完全免费、源码公开等特点,受到了IT从业人员的青睐,并被广泛部署于实际的生产环境中。

本书采用直观、循序渐进的方法,讲解了如何设计、实施和优化NoSQL数据库,如何存储和管理数据,以及如何执行数据分片和复制等任务。本书共分为24章,其内容涵盖了NoSQL和传统RDBMS的使用时机,理解基本的MongoDB数据结构和设计概念,安装和配置MongoDB,为自己的应用选择正确的NoSQL交付模型,规划和实施不同类型和规模的MongoDB数据库,设计MongoDB数据模型,创建新的数据库、集合和索引,掌握存储、查找和获取MongoDB数据的方法,通过PHP、Python、Java和Node.js/Mongoose与数据交互,在一致性、性能和持久性方面做出平衡,对MongoDB数据库进行管理、监控、验证、保护、备份和修复;掌握数据分片和复制等高级技术;实施GridFS存储来有效地存储和获取大型数据文件,评估用于优化性能的查询,查找和诊断与集合、数据库相关的问题。

本书适合对NoSQL以及MongoDB感兴趣的数据库开发、运维人员阅读。

译者序

托夫勒先生在其著作《第三次浪潮》中将“大数据”比喻为“第三次浪潮的华彩乐章”。30余年后,“大数据”开始成为互联网行业的热词,并最终走进人们的视线——大数据的面纱被逐渐揭开,对“大数据”的各种误读也逐渐被纠正。

尽管到现在为止,对“大数据”定义的表达仍然众说纷纭,但就“大数据”的特点来讲,著名数据科学家维克托·迈尔·舍恩伯格在与肯尼斯·库克耶合著的《大数据时代》中提出的“4V”基本得到了绝大多数的认同。所谓“4V”,是指Volume(数据量大)、Velocity(输入和处理速度快)、Variety(数据多样性)、Value(价值密度低)。从技术角度讲,大数据与云计算,有着密不可分的关系,这种关系类似汽车与高速公路。显而易见,大数据不可能用单台计算机进行处理,必然会采取分布式架构,对海量数据进行分布式数据挖掘,则必须依托云计算的分布式处理、分布式数据库、云存储以及虚拟化技术。NoSQL在这样的环境下得到了迅速的普及。作为NoSQL数据库四大分类之一的文档型数据库的杰出代表——MongoDB,则因为其易部署、易使用、高性能、数据存储方便等特点,得到了广泛的应用。

本书作者Brad Dayley,算得上是骨灰级软件工程师,拥有20多年的企业级应用程序开发经验,先后就职于Adobe、Novell、John Wiley等世界知名企业。Brad Dayley也是一位非常善于表达的技术流图书作者,曾经出版过Node.js, MongoDB and AngularJS Web Development、jQuery and JavaScript in 24 Hours, Sams Teach Yourself、Python Phrasebook、Photoshop CC Bible、jQuery and JavaScript Phrasebook、Silverlight Bible等多部图书。此次国内引进出版的这本《MongoDB入门经典》,是其2014年出版的新书。

这本书在内容的安排上,遵循了非常直观易读又循序渐进的思路,用24个课程教读者学会如何打造一个实时高效的大数据解决方案,即使读者没有任何的MongoDB部署经验。如何实现MongoDB,是这本书重点着墨的地方,也是初学MongoDB的人最需要彻底弄明白的地方——创建数据库和集合,在MongoDB数据库中存储、查找与检索各种数据。

值得一提的是,这本书的代码示例很有特点,既有用来演示知识点的在正文中的代码,也有在Try It Yourself章节中出现的更加完整的代码,还可以作为小型应用程序来运行。代码示例简洁优美,而且易懂易维护,是这本书的一个特点。

这本书的原书由SAMS公司出版,中文简体版由人民邮电出版社引进版权。相信此书能极大地满足广大MongoDB初学者的需求,还可以作为国内高等院校的相关专业教材。

本书的内容非常专业,语言精妙,而译者的水平和时间都相对有限,谬误与不当之处在所难免,敬请广大读者批评指正。河南理工大学计算机科学与技术学院 米爱中2014年冬

致谢

我要借此机会感谢所有让本书得以付梓的人员。首先,感谢我的妻子和儿子给予灵感和支持,如果没有你们,本书根本不可能完成。感谢Mark Taber确保本书没有偏离方向,感谢Russell Kloepfer所做的技术审阅,感谢Melissa Schirmer负责印制方面的杂务。

作者简介

Brad Dayley是一名资深软件工程师,拥有20多年企业级应用程序开发经验;设计并开发过大型商业应用程序,包括后端为NoSQL数据库、前端为Web的SAS应用程序;另著有jQuery and JavaScript Phrasebook、Sams Teach Yourself jQuery and JavaScript in 24 Hours和Node.js, MongoDB and AngularJS Web Development。

前 言

当前,互联网用户多达几十亿,传统的RDBMS数据库解决方案难以满足快速增长的海量数据处理需求,人们越来越多地采用专用数据库,它们不受制于传统SQL数据库的限制和开销。这些数据库被统称为NoSQL,意思是“不仅仅是SQL”;它们并非要取代SQL数据库,而是旨在提供另一种数据存储方式。

本书从MongoDB的角度讲授NoSQL概念。MongoDB是一种NoSQL数据库,以易于实现、健壮、可扩展著称,是当前使用最广泛的NoSQL数据库。MongoDB已成熟为稳定的平台,已被多家公司用来提供所需的数据可扩展性。

本书每章都介绍了将MongoDB用作高性能应用程序的后端存储所需的基本知识,阅读完本书后,您将对如何创建、使用和维护MongoDB数据库有深入认识。

请坐下来尽情享受学习MongoDB开发的旅程吧。组织结构

本书分为4个部分。● 第1部分,“NoSQL和MongoDB初步”,介绍NoSQL基本概

念、为何要使用NoSQL以及NoSQL数据库类型;探讨MongoDB

数据结构和设计概念以及如何安装和配置MongoDB。● 第2部分,“实现MongoDB”,讨论实现MongoDB的基本知

识,重点是创建数据库和集合以及在MongoDB数据库中存储、

查找和检索数据的各种方法。● 第3部分,“在应用程序中使用MongoDB”,介绍一些最常见

的编程环境中使用的MongoDB驱动程序。MongoDB驱动程序是

一个库,提供了以编程方式访问和使用MongoDB数据库所需的

工具。这部分涵盖了用于Java、PHP、Python和Node.js的

MongoDB驱动程序;针对每种语言的内容都自成一体,让您能

够跳过与您不感兴趣的语言相关的章节。● 第4部分,“其他MongoDB概念”,介绍其他MongoDB概念,

完善您的MongoDB知识。在这部分,您将学习MongoDB数据库

管理方面的基本知识,了解复制、分片和GridFS存储等

MongoDB高级概念。代码示例

本书的代码示例分两类,其中最常见的是夹杂在正文中的代码片段,旨在演示当前讨论的要点。另一种以Try It Yourself形式出现,这些代码示例更完备,可作为独立的小型应用程序运行。本书对代码示例进行了简化以确保它们短小易懂,例如,几乎没有包含错误检查代码。

为方便读者理解Try It Yourself示例代码,使用了包含行号的程序清单列出它们;在程序清单标题中,指出了代码来自哪个文件;另外,还通过独立的程序清单列出了示例代码的控制台输出,方便读者阅读本书时查看。问与答、小测验和练习

每章末尾都有简短的问答环节,对每位读者都会有的疑问做出了解答;简短而全面的小测验让您能够进行自测,确保您牢固地掌握了每个知识点;最后提供了一两个练习,让您有机会将新学到的知识付诸应用。第1章NoSQL和MongoDB简介本章介绍如下内容:● MongoDB如何组织数据;● MongoDB支持哪些数据类型;● 什么情况下该范式化数据,什么情况下该反范式化;● 如何规划数据模型;● 固定集合(capped collection)是如何工作的;● 什么情况下该使用索引、分片和复制;● 如何确定数据的生命周期。

在大多数大型应用程序和服务中,核心都是高性能的数据存储解决方案。后端数据存储负责存储用户账户信息、产品数据、记账信息和博客等重要数据。优秀的应用程序要求能够准确、快速、可靠地存储和检索数据,因此选择的数据存储机制的性能必须能够满足应用程序的需求。

有多种数据存储解决方案可用于存储和检索应用程序所需的数据,其中最常见的有三种:文件系统直接存储、关系型数据库和NoSQL数据库。本书介绍MongoDB,它是使用最广泛、功能最强大的NoSQL数据存储方式。

接下来的几节将介绍NoSQL和MongoDB,并讨论决定如何组织数据和配置数据库前需要考虑的设计因素。为此,将首先提出问题,再介绍能够满足这些需求的MongoDB内置机制。1.1 NoSQL是什么

一种常见的误解是,以为术语NoSQL指的是“非SQL”,它实际上指的是“不仅仅是SQL”,这旨在强调这样一点:NoSQL数据库并非SQL的替代品,它实际上也可使用类似于SQL的查询概念。

NoSQL是个包罗万象的术语,涵盖了除传统关系型数据库管理系统(RDBMS)之外的所有数据库。NoSQL旨在简化设计、支持横向扩展以及更细致地控制数据的可用性。NoSQL数据库专用于存储特定类型的数据,因此在大多数情况下效率和性能都高于RDBMS服务器。

NoSQL试图放弃关系型数据库的传统结构,让开发人员能够以更接近系统数据流需求的方式实现模型。这意味着NoSQL数据库能够以传统关系型数据库不支持的方式组织数据。

当前有多种不同的NoSQL技术,其中包括HBase列结构、Redis键/值结构以及Virtuoso图结构。然而,本章介绍MongoDB及其使用的文档模型,因为在为Web应用程序和服务实现后端存储方面,它提供了极高的灵活性和可扩展性。另外,MongoDB是当前使用最广泛、得到的支持最多的NoSQL语言。接下来的几小节描述一些NoSQL数据库类型。1.1.1 文档存储数据库

文档存储数据库采用面向文档的方法来存储数据,其背后的理念是,可将单个实体的所有数据都存储在一个文档中,而文档可存储在集合中。

文档可包含描述实体的所有必要信息,包括子文档;而在RDBMS中,子文档通常存储为编码字符串或存储在独立的表中。集合中的文档是通过独一无二的键访问的。1.1.2 键/值数据库

最简单的NoSQL数据库是键/值存储。这些数据库存储数据时不采用任何模式(schema),这意味着存储的数据无需遵循任何预定义的结构。键可指向任何数据类型,从对象到字符串值,再到编程语言的函数。

键/值存储的优点是易于实现和添加数据,因此非常适合用于提供基于键来存储和检索数据的简单存储,缺点是无法根据存储的值来查找元素。1.1.3 列存储数据库

列存储数据库在键空间内以列的方式存储数据,其中的键空间基于独一无二的名称、值和时间戳。这类似于键/值数据库,但列存储数据库适合用于存储根据时间戳来区分有效内容和无效内容的数据。这提供了这样的优点,即能够让数据库中存储的数据过期。1.1.4 图存储数据库

图存储数据库是为这样的数据设计的,即能够轻松将其表示为图。这意味着元素通过它们之间的关系相关联,而这些关系的数量是不确定的,就像家谱、社会关系、航线拓扑图或标准交通图那样。1.2 选择RDBMS、NoSQL还是两者

研究NoSQL数据库时,在选择哪种数据库以及如何使用它们方面,应保持开放心态。对于高性能系统尤其应该如此。

您可能选择只使用RDBMS或NoSQL,也可能需要结合使用它们以提供最佳的解决方案。

在所有高性能数据库中,都必须在速度、准确性和可靠性之间进行折衷。下面列出了选择数据库时需要考虑的一些因素。● 要存储的数据是什么样的?要存储的数据可能适合采用RDBMS

的表/行结构、文档结构或简单的键/值对结构。● 当前是如何存储数据的?如果数据当前存储在RDBMS数据库

中,就必须进行评估,将其全部或部分迁移到NoSQL需要多少

人力和物力。另外,还应考虑是否能够保留原来的数据不动,只

使用NoSQL数据库来存储新增的数据。● 确保数据库事务的准确性有多重要?NoSQL的一个缺点是,大

多数解决方案在ACID(原子性、一致性、隔离性和持久性)方

面都无法与广泛接受的RDBMS系统媲美。● 数据库的速度有多重要?如果对您的数据库来说,速度至关重

要,那么使用NoSQL可能是合适的,因为它能够极大地提高性

能。● 数据不可用将导致什么后果?考虑数据不可用对客户的影响有多

大。别忘了,在客户看来,数据库响应太慢也属于不可用。包括

MongoDB在内的很多NoSQL解决方案都使用复制和分片提供了

良好的高可用性计划。● 数据库将被如何使用?具体地说,考虑大多数数据库操作都是写

入还是读取的。您还可以据此确定数据分割边界,将主要被写入

的数据和主要被读取的数据分开。● 该将数据分开以充分利用RDBMS和NoSQL的优点吗?考虑前述

问题后,您可能想将有些数据(如关键交易)放在RDBMS数据

库中,而将其他数据(如博客文章)放在NoSQL数据库中。1.3 理解MongoDB

MongoDB是一种可扩展的敏捷NoSQL数据库,其中的Mongo源自单词humongous。MongoDB基于NoSQL文档存储模型;在这种模型中,数据对象被存储为集合中的文档,而不是传统关系型数据库中的行和列。文档是以二进制JSON(BSON)对象的方式存储的。

MongoDB旨在实现一种高性能、高可用、可自动扩展的数据存储,在本书后面您将看到,它安装和实现起来都非常简单。MongoDB因为速度快、可扩展性强、易于实现,为需要存储用户评论、博客和其他内容的网站提供了极佳的后端存储解决方案。

下面是MongoDB得以成为最受欢迎的NoSQL数据库的其他一些原因。● 面向文档:MongoDB是面向文档的,数据在数据库中的存储格

式与您要在服务器端脚本和客户端脚本中处理的格式非常接近。

这避免了将数据在行和对象之间进行转换。● 高性能:MongoDB是市面上性能最高的数据库之一。在当今世

界,很多用户都与网站交互,因此拥有能够支持庞大流量的后端

至关重要。● 高可用性:MongoDB的复制模型使其很容易保持高可用性,同

时能够提供高性能和高可扩展性。● 高可扩展性:MongoDB的结构使得能够将数据分布到多台服务

器,从而轻松地实现横向扩展。● 对SQL注入攻击免疫:MongoDB将数据存储为对象,而不使用

SQL字符串,因此对SQL注入攻击(通过浏览器在Web表单中输

入SQL语句,从而威胁DB的安全)免疫。1.3.1 理解集合

MongoDB使用集合将数据编组。集合是一组用途相同或类似的文档,相当于传统SQL数据库中的表,但存在一个重要差别:在MongoDB中,集合不受严格模式的管制,其中的文档可根据需要采用稍微不同的结构。这样就无需将文档的内容放在多个不同的表中,而在SQL数据库中经常需要这样做。1.3.2 理解文档

在MongoDB数据库中,文档表示单个实体的数据,而集合包含一个或多个相关的文档。MongoDB和SQL的一个主要差别在于文档不同于行:行数据是扁平的,每列都包含行中的一个值,而在MongoDB中,文档可包含嵌入的子文档,提供的数据模型与应用程序的要求更一致。

事实上,MongoDB中表示文档的记录是以BSON(一种轻量级二进制JSON)的方式存储的。BSON是一种轻量级二进制JSON,使用对应于JavaScript属性/值对的字段/值对来定义文档中存储的值。几乎不需要做任何转换,就能将MongoDB记录转换为您可能在应用程序中使用的JSON字符串。

例如,MongoDB中文档的结构可能类似于下面这样,其中包含字段name、version、languages、admin和paths:{ name: "New Project", version: 1, languages: ["JavaScript", "HTML", "CSS"], admin: {name: "Brad", password: "****"}, paths: {temp: "/tmp", project:"/opt/project", html: "/opt/project/html"}}

注意到在这个文档结构中,包含类型为字符串、整数、数组和对象的字段/属性,就像JavaScript对象一样。表1.1列出了BSON文档支持的字段值数据类型。

字段名不能包含空格、句点(.)和美元符号($)。另外,字段名_id保留用于存储对象ID(Object ID)。字段_id包含系统中独一无二的ID,这种ID由下列几部分组成:● 从新纪元开始的秒数(4字节)。● 3字节的机器标识符。● 2字节的进程ID。● 3字节的计数器(该计数器的起始值是随机的)。

MongoDB文档最大不能超过16MB,这旨在避免查询占用太多RAM或频繁访问文件系统。文档也许根本不会接近这样的规模,但设计包含文件数据的复杂类型时必须牢记这种最大文档限制。1.4 MongoDB数据类型

BSON数据格式提供了多种类型,可用于以二进制方式存储JavaScript对象。这些类型与JavaScript类型非常接近,理解它们很重要,因为查询MongoDB时,您可能要查找指定属性的值为特定类型的对象。例如,您可能在数据库中查询这样的文档:其时间戳为String 对象或Date对象。

MongoDB给每种数据类型都分配了1~255的整数ID号,以方便您按类型查询。表1.1列出了MongoDB支持的数据类型以及MongoDB用来标识它们的编号。表1.1 MongoDB数据类型及其ID号类型编号Double(双精度浮点数)1String(字符串)2Object(对象)3Array(数组)4Binary data(二进制数据)5Object ID(对象ID)7Boolean(布尔值)8Date(日期)9Null(空)10Regular expression(正则表达式)11JavaScript13Symbol(符号)14JavaScript(带作用域)1532-bit integer(32位整数)16Timestamp(时间戳)1764-bit integer(64位整数)18Min key255Max key127

使用MongoDB支持的各种数据类型时,需要注意的另一点是它们的排序顺序。比较不同BSON类型的值时,MongoDB使用下面的排序顺序(从小到大):

1.Min key(内部使用的类型)。

2.Null。

3.数字(32为整数、64位整数和双精度浮点数)。

4.符号和字符串。

5.对象。

6.数组。

7.二进制数据。

8.对象ID。

9.布尔值。

10.日期和时间戳。

11.正则表达式。

12.Max key(内部使用的类型)。1.5 规划数据模型

实现MongoDB数据库前,需要了解要存储的数据的性质、如何存储这些数据,以及将如何访问它们。这让您能够预先做出决定,进而通过组织数据和应用程序来获得最佳性能。

具体地说,您需要自问下面的问题:● 应用程序将使用哪些基本对象?● 不同对象类型之间的关系是一对一、一对多还是多对多的?● 在数据库中添加新对象的频率有多高?● 从数据库中删除对象的频率有多高?● 修改对象的频率有多高?● 访问对象的频率有多高?● 将如何访问对象?根据ID、属性值、比较还是其他方式?● 将如何多个对象?根据ID、属性值还是其他方式?

找到这些问题的答案后,便可以开始考虑MongoDB数据库中集合和文档的结构了。接下来的几小节讨论各种MongoDB建模方法,您可使用它们来为文档、集合和数据库建模以优化数据存储和访问。1.5.1 使用文档引用范式化数据

数据范式化指的是通过组织文档和集合以最大限度地减少冗余和依赖。为此,可找出这样的对象属性,即属性为子对象,而且应作为一个独立的文档存储在对象文档中的不同集合中。通常这对于这样的对象很有用,即与子对象的关系是一对多或多对多的。

对数据进行范式化的优点是,可减少数据库的规模,因为将只在独立的集合中存储子对象的一个拷贝,而不是在多个对象中重复存储它们。另外,如果需要频繁地修改子对象中的信息,将只需在一个地方修改,而无需在包含它的每个对象中进行修改。

对数据进行范式化的一个重大缺点是,查找对象时如果需要返回子对象,就必须再次查找它。如果需要频繁地访问这些对象,这将严重影响性能。

例如,如果一个系统中的用户都喜欢同一个商店,那么该系统适合对数据进行范式化。表示用户的对象包含属性name、phone和favoriteStore,其中的属性favoriteStore是一个子对象,包含属性name、street、city和zip。

数千位用户可能都喜欢同一个商店,这是一种明显的一对多关系。因此,在每个User对象中都存储FavoriteStore对象不合理,因为这可能导致相同的对象存储数千次。相反,FavoriteStore对象应包含一个_id属性,用于在User对象中引用FavoriteStore对象。这样,应用程序就可在Users集合中使用引用ID favoriteStore关联到FavoriteStores集合中的FavoriteStore文档。

图1.1说明了刚才描述的集合Users和FavoriteStores的结构。图1.1 添加指向另一个集合中文档的引用,以定义范式化MongoDB文档1.5.2 使用嵌入式文档对数据进行反范式化

对数据进行反范式化指的是找出应直接嵌入到主对象文档中的子对象。这通常适用于这样的情形:主对象和子对象之间为一对一关系或者子对象很少且不会频繁更新。

反范式化文档的主要优点是,只需一次查找就能获得整个对象,而无需在其他集合中查找子对象。这可极大地改善性能。其缺点是,对于与主对象存在一对多关系的子对象,将其存储多个拷贝,这将稍微降低插入速度,还将占用更多的磁盘空间。

一个适合对数据进行反范式化的例子是,系统包含用户的家庭联系信息和工作联系信息。这种用户用包含属性name、home和work的User文档表示,其中属性home和work都是子对象,包含属性phone、street、city和zip。

用户的属性home和work不会频繁变化;多名用户的家庭联系信息可能相同,但这样的情况不会太多。另外,这些子对象存储的值不大,也不会频繁变化。因此,将家庭联系信息直接存储在User对象中是合适的。

属性work需要考虑一下。在您接触的人当中,有多少人的工作联系信息相同呢?如果答案是不多,那么子对象work也应嵌入到User对象中。查询User时,需要获取工作联系信息的频率高吗?如果很少这样做,也许应该将work存储在独立的集合中。然而,如果经常或总是需要这样做,也许应该将其嵌入到User对象中。

图1.2说明了前面描述的内嵌家庭和工作联系信息的User文档的结构。图1.2 将对象内嵌在文档中,以定义反范式化MongoDB文档1.5.3 使用固定集合

MongoDB的一个优秀特性是,能够创建固定集合。固定集合是大小固定的集合:集合达到指定大小时,如果需要写入新文档,将把最旧的文档删除,再插入新文档。固定集合非常适合用于存储插入、检索和删除频繁的对象。

下面列出了使用固定集合的好处。● 固定集合保证按插入顺序排列文档。查询不需要使用索引就能按

存储顺序返回文档,避免了建立索引的开销。● 固定集合禁止执行导致文档增大的更新,以保证文档在磁盘中的

存储顺序与插入顺序相同。这避免了移动文档以及管理文档新位

置的开销。● 固定集合自动删除集合中最旧的文档,这让您无需在应用程序中

实现删除功能。

固定集合也带来了如下限制。● 更新文档时,不能导致它比插入到固定集合时大。您可以更新固

定集合中的文档,但修改后不能比原来大。● 您不能删除固定集合中的文档,因此不再使用的数据也将占用磁

盘空间。您可显式地删除固定集合,这将删除所有的条目;因此

要再次使用它必须重新创建。

固定集合非常适合用于存储系统中滚动的事务日志。这让您总是能够访问最后几个日志条目,且不需要显式地删除最旧的条目。1.5.4 理解原子写入操作

在MongoDB中,写入操作在文档级是原子性的。不能有多个进程同时更新一个文档或集合,这意味着对反范式化文档的写入是原子性的。然而,写入范式化文档时,需要对其他集合中的子文档执行独立的写入操作,因此对范式化文档的写入可能不是原子性的。

设计文档和集合时,必须考虑写入的原子性,以确保设计符合应用程序的要求。换句话说,如果必须将写入对象的各个部分作为一个整体,并确保其原子性,就需要以非范式化方式设计对象。1.5.5 考虑文档增大

当您更新文档时,必须考虑其在文档增大方面的影响。MongoDB在文档中提供了一些留白,以支持更新操作导致的典型增大。然而,如果更新导致文档增大到超过了分配给它的磁盘空间,MongoDB就必须将文档移到磁盘的其他位置,而这将影响系统的性能。频繁地移动文档还可能导致磁盘碎片问题。例如,如果文档包含一个数组,而您在这个数组中添加了很多元素,导致文档大小超过了分配给它的空间,就必须将该文档移到磁盘的其他位置。

缓解文档增大问题的方式之一是,对于可能频繁增长的属性,将其设计为范式化对象。例如,不使用数组来存储Cart对象中的商品,而创建一个用于存储商品的CartItems;这样就可以将加入到购物车的商品作为新对象存储到集合CartItems中,并在Cart对象中引用这些商品。1.5.6 找出可使用索引、分片和复制的情形

MongoDB提供了多种优化性能、扩展性和可靠性的机制。制定数据库设计方案时,请考虑如下选项。● 索引:索引可改善常用查询的性能,这是通过建立可轻松排序的

查找索引实现的。由于根据ID查找文档的查询很常见,因此会自

动创建基于_id字段的索引。然而,您还需考虑用户访问数据的

其他方式,并建立可改善这些查询方式的索引。● 分片:分片指的是拆分大型数据集合,将其放到集群中的多个

MongoDB服务器中。这让大型系统能够使用多个服务器来支持

大量的请求,对数据库实现了横向扩展。您应考虑数据量以及访

问数据的请求数,以确定是否要对集合进行分片以及使用多少个

分片。● 复制:复制指的是将数据复制到集群中的多个MongoDB实例。

考虑数据库的可靠性时,应实现复制以确保始终有重要数据的备

份拷贝。1.5.7 使用大型集合还是大量集合

设计MongoDB文档和集合时,需要考虑的另一个因素是,使用这种设计时将有多少个集合。存在大量集合不会严重影响性能,但一个集合包含大量数据会严重影响性能。对于太大的集合,应想办法将其分成多个。

一个这样的例子是在数据库中存储用户的历史交易记录。您认识到,不需要同时查询多名用户的历史交易记录;保留这些记录只是为了让用户能够查看自己的历史交易。如果有数千名用户,而每位用户都有大量的交易,那么将每位用户的历史交易记录分别存储在一个集合中是合适的。1.5.8 确定数据的生命周期

设计数据库时,最容易忽视的一个方面是数据的生命周期。文档应在集合中存在多久?有些集合包含应永远保留的文档,如活动用户账户。然而,别忘了查询集合时,系统中的每个文档都会带来性能开销。在每个集合中,都应指定文档的存活时间(Time To Live,TTL)。

在MongoDB中实现TTL机制的方式有多种。一种方法是在应用程序中实现对旧数据进行监视和清理的代码;另一种方法对集合设置MongoDB TTL,指定多少秒后或到达指定时间后自动将文档删除。

在只需要最新的文档时,还可实现固定集合来自动限制集合的大小。1.5.9 考虑数据可用性和性能

需要考虑(甚至反复考虑)的最后一点是数据可用性和性能。对任何Web解决方案来说,这两个方面都是最重要的,因此对提供支持的存储解决方案来说亦如此。

数据可用性指的是数据库能够满足网站的功能需求。您首先需要确保网站能够访问这些数据,这样网站才能正确地运行。用户不会容忍网站不按其指令行事,这也包含数据的准确性。

接下来,需要考虑性能。数据库必须以能够接受的速度提供数据。有关如何评估和设计数据库性能,请参阅前几小节。

在比较复杂的情况下,可能必须先评估数据可用性,再考虑性能,然后回过头去再评估数据可用性,这样循环往复几次,直到找到正确的平衡点。另外别忘了,在当今的世界,可用性需求可能随时发生变化。设计文档和集合时,务必确保它们必要时都能够轻松地扩展。1.6 小结

大多数大型Web应用程序和服务的核心都是高性能的数据存储解决方案。后端数据存储负责存储各种信息,从用户账户信息到购物车中的商品,再到博客和评论。优秀的Web应用程序必须能够准确、快速、可靠地存储和检索数据,因此选择的数据存储机制的性能必须满足用户的需求。

有多种数据存储解决方案可用于存储和检索Web应用程序所需的数据,其中最常见的三种是直接文件系统存储、关系型数据库和NoSQL数据库。本书介绍数据存储解决方案MongoDB,它是一种NoSQL数据库。

本章介绍了决定如何组织数据和配置MongoDB数据库前,必须考虑的设计因素;还介绍了要提出的设计问题以及如何使用MongoDB内置的机制来解决这些问题。1.7 问与答问:MongoDB有哪些版本?

答:有用于Windows、Linux、Mac OS X和Solaris的MongoDB版本。还有企业订阅版本,供要求企业级功能、正常运行时间和支持的专业和商业应用程序使用。如果MongoDB数据对应用程序来说生死攸关,且DB流量非常高,可考虑使用付费的订阅版本。有关这方面的更详细信息,请参阅https://www.mongodb.com/products/mongodb-subscriptions。问:MongoDB有模式吗?

答:从某种程度上说有。MongoDB实现动态模式,让您创建集合时无需规定文档结构。这意味着可在同一个集合中存储包含不同字段的文档。1.8 作业

作业包含一组问题及其答案,旨在加深您对本章内容的理解。请尽可能先回答问题,再看答案。1.8.1 小测验

1.范式化文档和反范式化文档有何不同?

2.判断对错:JavaScript是MongoDB文档支持的一种数据类型。

3.固定集合有何用途?1.8.2 小测验答案

1.反范式化文档包含子文档,而范式化文档的子文档存储在另一个集合中。

2.对。

3.固定集合让您能够对集合的大小或存储的文档数进行限制,从而只保留最新的文档。1.8.3 练习

1.访问MongoDB文档网站并浏览FAQ网页。这个网页回答了多个与各种主题相关的问题,是个不错的起点。FAQ网页的网址为http://docs.mongodb.org/manual/faq/。第2章安装和配置MongoDB

本章介绍如下内容:● 安装并配置MongoDB服务器;● 访问MongoDB HTML界面;● 使用MongoDB shell访问MongoDB服务器;● 使用MongoDB shell原生方法;● 使用JavaScript脚本与MongoDB服务器交互。

本章旨在让您快速熟悉MongoDB。前一章侧重于MongoDB的理论方面,而本章侧重于实际使用。您将学习如何安装MongoDB、启动和停止引擎以及访问MongoDB shell。MongoDB shell让您能够管理MongoDB服务器以及执行各种必要的任务。您将发现,在开发过程中以及管理数据库时,经常需要使用MongoDB shell。

本章介绍如何安装、配置、启动和停止MongoDB数据库;还将介绍MongoDB shell,它让您能够执行从创建用户账户和数据库到实现复制和分片在内的各种MongoDB管理任务。2.1 搭建MongoDB环境

要开始使用MongoDB,首先需要在您的开发系统中安装它,然后就可以尝试完成各种任务并学习MongoDB shell了。

接下来的几小节将介绍如何安装MongoDB、启动和停止其数据库引擎以及访问MongoDB shell。知道如何执行这些任务后,您便能够开始使用MongoDB了。2.1.1 安装MongoDB

实现MongoDB数据库的第一步是安装MongoDB服务器。有用于各种主要平台(Linux、Windows、Solaris和OS X)的MongoDB版本;还有用于Red Hat、SuSE、Ubuntu和Amazon Linux的企业版。MongoDB企业版是基于订阅的,提供了更强大的安全、管理和集成支持。

就本书以及学习MongoDB而言,MongoDB标准版就很好。有关如何下载并安装MongoDB,请参阅http://docs.mongodb.org/manual/installation/。

下面大致介绍了安装和配置过程,本节最后将引导您完成安装和配置。

1.下载MongoDB文件并解压缩。

2.在系统路径中添加/bin。

3.创建一个数据文件目录:/data/db。

4.在控制台提示符下使用下面的命令启动MongoDB。mongod –dbpath /data/db2.1.2 启动MongoDB

安装MongoDB,需要知道如何启动和停止数据库引擎。要启动数据库引擎,可执行/bin中的可执行文件mongod(Windows中为mongod.exe)。这个可执行文件启动MongoDB服务器,并开始在指定端口上侦听数据库请求。

可执行文件mongod接受多个参数,这些参数提供了控制其行为的途径。例如,您可以配置MongoDB在哪个IP地址和端口上侦听,还可配置日志和身份验证。表2.1列出了最常用的参数。

下面的示例在启动MongoDB时指定了参数port和dbpath:mongod –port 28008 –dbpath /data/db表2.1 mongod命令行参数参数描述--help,-h返回基本的帮助和用法信息--version返回MongoDB的版本--config 指定包含运行阶段配置的配置文件,-f --verbose、-v增加内部报告的信息量;这些信息被发送到控制台,并被写入到--logpath指定的日志文件--quiet减少发送到控制台和日志文件的内部报告的信息量--port 指定一个TCP端口,mongod将在这个端口上侦听客户端连接。默认为27017--bind_ip 口--maxConns 指定mongod最多同时接受多少个连接,最多为20000个--logpath 指定日志文件的路径。重启后将覆盖日志文件,除非指定了--logappend--auth启用数据库身份验证,对从远程主机连接到数据库的用户进行身份验证--dbpath 指定一个目录,mongod实例将在其中存储数据--nohttpinterface禁用HTTP接口--nojournal禁用支持持久性的日记功能(journaling)--noprealloc禁用数据文件预分配。这将缩短启动时间,但可能严重影响正常操作的性能--repair对所有数据库运行修复例程2.1.3 配置MongoDB

除指定命令行参数外,可执行文件mongod还可接受一个配置文件,其中指定了控制MongoDB服务器行为的配置选项。使用配置文件可更轻松地管理MongoDB配置设置;另外,可创建多个配置文件,供各种数据库角色使用,如开发、测试和生产。

这些配置选项是使用下面的格式指定的,其中为配置设置,而指定了设置的值: =

例如,下面的是一个简单的基本配置文件示例:verbose = trueport = 27017dbpath = /data/dbnoauth = true

表2.2列出了在配置文件中指定的一些常见配置选项,让您对可指定哪些配置选项有大致了解。表2.2 mongod配置文件设置设置描述verbose增加内部报告的信息量,这些信息将显示到控制台屏幕上或写入到日志文件中。可能取值为true和false。另外,还可使用v、vv、vvv或vvvv来提高详细等级。例如: verbose = true vvv = truelogpath指定将包含MongoDB日志条目的日志文件的位置和文件名logappend如果为false,每次启动mongod实例时都将新建一个日志文件,并覆盖旧的日志文件;如果为true,将不会覆盖旧的日志文件,而在它末尾附加。默认为falseport指定一个TCP端口,mongod将在这个端口上侦听客户端连接。默认为27017bind_ip指定一个用逗号分隔的IP地址列表,mongod将在这些地址上侦听。默认为所有接口maxConns指定MongoDB服务器最多可同时接受多少个连接auth如果为true,将启用数据库身份验证,这意味着客户端必须提供身份验证凭证。默认为falsenoauth如果为true,将禁用身份验证journal如果为true,将启用操作日记,以确保持久性和数据一致性。在64位系统上默认为true,在32位系统上默认为falsenohttpinterface如果为true,将禁用用于访问服务器状态和日志的HTTP接口。默认为falserest如果为true,将启用MongoDB数据库服务器的简单REST接口,让您能够通过发送REST请求来访问数据库。默认为false2.1.4 停止MongoDB

启动可执行文件mongod后,停止它的方法随平台而异。然而,停止它的最佳方法是在MongoDB shell中进行,这将干净地终止当前操作,并强制mongod退出。

要在MongoDB shell中停止MongoDB数据库服务器,可使用下面的命令,切换到admin数据库再关闭数据库引擎:use admindb.shutdownServer()▼ Try It Yourself在开发环境中安装并配置MongoDB在本节中,您将在开发环境中实现MongoDB。继续往下阅读前,务必完成本节介绍的步骤,确保在您的开发环境中正确地配置了MongoDB。请按如下步骤在您的开发系统中安装并配置MongoDB。1.前往www.mongodb.org/downloads,根据您的系统下载相应的MongoDB生产版本。2.将文件解压缩到要运行MongoDB的位置(以下称之为)。3.在系统路径中添加/bin。4.创建一个数据文件目录:/data/db。5.创建配置文件/bin/mongod_config.txt。6.在该配置文件中添加如下配置设置并存盘:verbose = trueport = 27017dbpath=c:\mongodb\data\db\noauth = truemaxConns = 10rest = true7.启动MongoDB服务器。打开一个控制台窗口,并在其中使用下面的命令启动;您需要将替换为您的安装目录。这将启动MongoDB数据库服务器。mongod --config /bin/mongod_config.txt8.启动MongoDB shell。再打开一个控制台窗口,并执行命令mongo来启动MongoDB shell。9.执行下面的命令以停止MongoDB服务器:use admindb.shutdownServer()10.执行命令exit退出MongoDB shell。至此,您成功地安装、配置、启动和停止了MongoDB服务器。▲2.2 访问MongoDB HTTP接口

MongoDB内置了一个HTTP接口,可向您提供有关MongoDB服务器的信息。HTTP接口提供了有关MongoDB服务器的状态信息,还提供了一个REST接口,让您能够通过REST调用来访问数据库。

在大多数情况下,您都将在应用程序中使用编程语言专用的驱动程序来访问MongoDB数据库。然而,使用HTTP接口通常有助于获悉如下信息。● 版本。● 数据库个数。● 活动游标数。● 复制信息。● 客户端信息,包括锁和查询。● DB日志视图。

要访问MongoDB HTTP接口,可访问该接口的端口28017。

例如,在启动了MongoDB服务器的情况下,在本地主机上使用下面的URL可访问MongoDB HTTP接口(如图2.1所示):http://localhost:28017/。图2.1 使用MongoDB HTTP接口在浏览器中查看MongoDB数据库信息2.3 从MongoDB shell访问MongoDB

安装、配置并启动MongoDB后,便可通过MongoDB shell访问它了。MongoDB shell是MongoDB自带的一个交互式JavaScript shell,让您能够访问、配置和管理MongoDB数据库、用户等。使用这个shell可执行各种任务,从设置用户账户到创建数据库,再到查询数据库内容,无所不包。

接下来的几小节将带您完成在MongoDB shell中执行的一些常见管理任务。具体地说,您需要能够创建用户账户、数据库和集合,才能完成本书后面的示例。您至少还应能够执行基本的文档查询,以帮助排除数据访问故障。2.3.1 启动MongoDB shell

MongoDB shell是一个可执行文件,位于MongoDB安装路径下的/bin文件夹中。要启动MongoDB shell,可执行命令mongo。这将在控制台提示符中启动该shell,如图2.2所示。图2.2 启动MongoDB shell

启动MongoDB shell后,就可通过它管理MongoDB的各个方面。使用MongoDB shell时,别忘了它是基于JavaScript的。这意味着您可使用大部分JavaScript语法(包括循环和函数)来与数据库交互。2.3.2 理解MongoDB shell命令

MongoDB shell提供了多个命令,您可在shell提示符下执行它们。您需要熟悉这些命令,因为您将经常使用它们。表2.3列出了多个MongoDB shell命令及其用途。表2.3 MongoDB shell命令命令描述help

MongoDB shell提供了用于执行管理任务的原生方法,您可在MongoDB shell中直接调用它们,也可在MongoDB shell中执行的脚本中调用它们。

包括DB、Collection和Cursor在内的JavaScript对象也提供了管理方法,这将在本书后面讨论。

表2.4列出了最常见的原生方法,它们提供了建立连接、创建对象、加载脚本等功能。表2.4 MongoDB shell原生方法和构造函数方法描述Date()创建一个Date对象。默认情况下,创建一个包含当前日期的Date对象UUID(hex_strin将32字节的十六进制字符串转换为BSON子类型UUIDg)ObjectId.将一个ObjectId的属性str显示为十六进制字符串valueOf()Mongo.返回一个数据库对象,它表示指定的数据库getDB(database)Mongo(host:创建一个连接对象,它连接到指定的主机和端口port)connect(string)连接到指定MongoDB实例中的指定数据库。返回一个数据库对象。连接字符串的格式如下:host:port/database,如db = connect("localhost:28001/myDb")cat(path)返回指定文件的内容version()返回当前MongoDB shell实例的版本cd(path)将工作目录切换到指定路径getMemInfo()返回一个文档,指出了MongoDB shell当前占用的内存量hostname()返回运行MongoDB shell的系统的主机名_isWindows()如果MongoDB shell运行在Windows系统上,就返回true;如果运行在UNIX或Linux系统上,就返回falseload(path)在MongoDB shell中加载并运行参数path指定的JavaScript文件_rand()返回一个0~1的随机数2.3.4 理解命令参数和结果

MongoDB shell是一个交互式JavaScript shell,与MongoDB数据结构联系紧密。这意味着大部分数据交互(从传递给方法的参数到从方法返回的数据)都是标准的MongoDB文档——在大多数情况下都是JavaScript对象。

例如,创建用户时,传入一个类似于下面的文档来定义用户:db.addUser( { user: "testUser", userSource: "test", roles: [ "read" ], otherDBRoles: { testDB2: [ "readWrite" ] } } )

在MongoDB shell中列出数据库的用户时,以类似于下面的文档列表显示用户:> db.system.users.find(){ "_id" : ObjectId("529e71927c798d1dd56a63d9"), "user" : "dbadmin", "pwd" : "78384f4d73368bd2d3a3e1da926dd269", "roles" : [ "readWriteAnyDatabase", "dbAdminAnyDatabase", "clusterAdmin" ]}{ "_id" : ObjectId("52a098861db41f82f6e3d489"), "user" : "useradmin", "pwd" : "0b4568ab22a52a6b494fd54e64fcee9f", "roles" : [ "userAdminAnyDatabase" ]}2.4 MongoDB shell脚本编程

正如您看到的,MongoDB shell命令、方法和数据结构都是基于交互式JavaScript的。为管理MongoDB,一种很不错的方法是创建脚本,这些脚本可运行多次,也可在指定的时间(如升级时)运行。

在脚本文件中,可包含任意数量使用JavaScript(如条件语句和循环)的MongoDB命令。MongoDB shell脚本编程主要是通过三种方式实现的。● 在命令行使用参数--eval ,其中expression是要执行

的JavaScript表达式。● 在MongoDB shell启动后,调用方法load(script_path),其中

script_path是要执行的JavaScript文件的路径。● 在命令行指定要执行的JavaScript文件。

接下来的几小节详细介绍这些方式。2.4.1 使用命令行选项--eval执行JavaScript表达式

一种以脚本方式执行MongoDB shell命令的方法是,使用命令行选项--eval。参数--eval接受一个JavaScript字符串或JavaScript文件,启动MongoDB shell,并立即执行这些JavaScript代码。除--eval外,您还可使用其他命令行参数指定配置文件、数据库、端口、身份验证信息等。

例如,下面的命令启动MongoDB shell,连接到数据库test,对该数据库执行db.getCollections(),并以JSON字符串的方式输出结果:mongo test --eval "printjson(db.getCollectionNames())"

上述命令的输出类似于下面这样:C:\Users\Brad>mongo words --eval "printjson(db.getCollectionNames())"MongoDB shell version: 2.4.8

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载