mongodb 是干什么用的? 或者问mongodb是为了解决什么的? ?

MongoDB

介绍一种更适合爬虫使用的数据库——MongoDB。MongoDB(来自于英文单词Humongous,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库,MongoDB的数据模式可以随着应用程序的发展而灵活地更新。与此同时,它也为开发人员提供了传统数据库的功能:二级索引、完整的查询系统以及严格一致性等等。

MongoDB是专为可扩展性、高性能和高可用性而设计的数据库。它可以从单服务器部署扩展到大型、复杂的多数据中心架构。利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。 MongoDB的本地复制和自动故障转移功能够使应用程序具有企业级的可靠性和操作灵活性。

Ø MongoDB简介

MongoDB是一个基于分布式文档存储的数据库,由C++编写,旨在解决海量数据的访问效率问题。MongoDB属于NoSQL(Not Only SQL,泛指非关系型数据库)数据库,但是它又与关系型数据库非常相似,在爬虫开发中使用MongoDB来存储大规模的数据是不错的选择。

MongoDB支持的数据结构非常松散,是类似JSON的BSON(是一种类JSON的一种二进制形式的存储格式,简称Binary JSON)格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

Ø MongoDB适用场景

MongoDB 的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS 系统(Relational Database Management System,关系型数据库)之间架起一座桥梁,它集两者的优势于一身。

MongoDB与RDBMS的最大区别:没有固定的行列组织数据结构,即无须将不同类的数据放入多张表中建立对应关系并分别存储其数据,而是直接放入一份文档进行存储。

MongoDB适用的场景如下。

(1)网站数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

(2)缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由 MongoDB 搭建的持久化缓存层可以避免下层的数据源过载。

(3)大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候开发人员往往会选择传统的文件进行存储。

(4)高伸缩性的场景:MongoDB 非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对 MapReduce 引擎的内置支持。

(5)用于对象及 JSON 数据的存储:MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询。

Ø MongoDB的安装

本书是在Windows环境中编写,故接下来讲解MongoDB在Windows系统下的安装。MongoDB的下载地址为“https://www.mongodb.com/download-center#community”,打开该网址后选择需要的版本安装即可。本书使用的是Windows 64位系统,因此选择Windows 64-bit x64版本即可,如图所示。

下载完.msi文件后双击开始安装,在安装过程中可单击Custom按钮自定义安装位置,如下面两图所示。

需要注意的是,在最后一步安装过程中,需要取消选中左下角的Install MongoDB Compass复选框,不然会一直卡在Installing MongoDB Compass...界面直到安装好MongoDB Compass为止。MongoDB Compass是MongoDB的图形化管理界面,下载需要的时间比较长,如果需要安装也是可以的,耐心等待即可。

安装成功后首先需要创建数据目录db,因为MongoDB默认将数据目录存放在db目录下。数据目录最好创建在根目录下,本书是在C盘的根目录下创建data目录,然后在data目录下创建db目录和log目录,其中log目录用来存放日志。创建的命令过程如下所示:

创建完成数据目录后进入MongoDB的bin目录下执行以下命令:

运行该命令,如图所示。

运行完成后,在浏览器的地址栏中输入http://localhost:27017/,运行结果如图所示。

MongoDB默认端口号为27017,上图界面说明MongoDB已经启动成功。启动后即可进行相应操作。

每次启动MongoDB都要进入安装目录的bin目录下执行mongod.exe命令,这样的操作很烦琐,此时可以为MongoDB添加一个服务。MongoDB添加为系统服务的方式很简单,在C盘新建的data目录下创建名为config的目录,并在config目录下新建mongodb.conf的配置文件,如图所示。

其中mongodb.conf的文件内容如图所示。

在mongodb.conf的文件内容中,logpath表示日志存放位置为新建的data目录下log目录中的mongodb.log文件,logappend=true表示可追加日志内容,dbpath表示数据库存放位置,serviceName表示服务名称,port是启动端口,MongoDB默认启动端口为27017。

编写好配置文件后,进入MongoDB安装目录下的bin目录,执行以下命令:

运行上述命令后,就创建好了MongoDB的系统服务,在服务栏中就可找到命名为MongoDB的服务。如图所示。

使用命令“net start mongodb” 和“net stop mongodb”即可开启和停止该服务。如图所示。

至此,MongoDB在Windows上就已安装配置成功。

MongoDB的启动参数代表的含义如表所示。

MongoDB基础

MongoDB属于NoSQL数据库,其中的一些概念与MySQL等关系型数据库大不相同。MongoDB中基本的概念是文档、集合和数据库。下面通过表将SQL概念和MongoDB中的概念进行对比。

1. MongoDB中文档、集合、数据库的概念

1)文档

文档是MongoDB中数据的基本单元,是MongoDB的核心概念,类似关系数据库中的行。将多个键及其关联的值有序地放置在一起就是MongoDB中的文档,有唯一的标识“_id”。文档以key/value的方式来存放数据,比如{"username":"qianfeng", "age":20},可类比数据表中的列名,以及列对应的值。下面通过3个不同文档来说明文档的特性。

上面3个文档是不同的,说明了文档的几个特性:

文档的键值对是有序的,顺序不同文档也不同。

文档的值可以是字符串、整数、数组以及文档等类型。

文档的键最常见的是用双引号标识的字符串,较特殊的键可以使用任意UTF-8字符。注意键不能含有\0(空字符),空字符表示键的结尾;“.”和“$”作为保留字符,通常不应该出现在键中;以下画线“_”开头的键通常情况下是保留的,建议不要使用。

文档区分大小写以及值的类型。

2)集合

集合可看作没有模式的表。MongoDB中的集合就是一组文档,可类比关系数据库的表。集合存放于数据库中,MongoDB对集合的结构不做强制要求,由开发者灵活把握。比如{"name":"qianfeng", "age":20}、{"name":"qianfeng", "age":20, "sex":"1"},可以存放于同一个集合中。

集合的命名规则如下:

(1)集合名不能是空串。

(2)不能含有空字符\0。

(3)不能以“system.”开头,这是系统集合保留的前缀。

(4)集合名不能含保留字符$。

4)数据库

MongoDB中多个集合组成数据库,一个MongoDB中可承载多个数据库,且彼此独立。每个数据库都有自己的集合和权限,不同的数据库放置在不同的文件中。在MongoDB的shell窗口中,使用show dbs命令可以查看所有的数据库,使用db命令可以查看当前数据库。

2. MongoDB常见数据类型

MongoDB中常用的几种数据类型如表所示。

3. 创建/删除数据库

MongoDB创建数据库的语法格式如下所示:

如果数据库不存在,则创建数据库,存在则直接切换到指定的数据库。查看所有的数据库可使用show dbs命令,若数据库中没有数据则不显示。

MongoDB删除数据库的语法格式如下所示:

使用“db”命令可以查看当前数据库名。

下面通过MongoDB的shell中新建一个名称为pythonSpider的数据库,接着再删除,如图所示。

注意上面创建与删除过程须在MongoDB服务启动的前提下操作,启动之后还要在MongoDB的bin目录下使用mongo命令。

4. 集合中文档的增删改查

依旧使用pythonSpider数据库来演示。文档的数据结构和JSON基本一致,所有存储在集合中的数据都是BSON格式,BSON是类JSON的一种二进制形式的存储格式。

插入文档使用insert()或save()方法,如图所示。

上图中python是集合名称,如果该集合不在该数据库中,MongoDB会自动创建该集合并插入文档,插入文档的格式必须符合BSON格式。

查询文档使用find()方法,如图所示。

上图中使用find()方法查找出python集合中的所有文档,相当于“select*from table”。如果需要进行条件查询,则应了解MongoDB中的条件语句和操作符,如表所示。

上表中的pretty()方法是以易读的方式来读取数据。除了以上表中单条件操作外,MongoDB中还可以使用条件组合来查询文档,类似and和or实现的功能。

使用find()方法可以传入多个键(key),每个键以逗号隔开,来实现and条件。or条件语句可使用关键字“$or”。

更新文档使用update()和save()方法来更新集合中的文档。其中update()方法用于更新已经存在的文档,方法原型如下:

其中,参数query是查询条件,类似于where子句;update参数是需要更新的操作符,类似于set后的内容;upsert是可选参数,用于确定当不存在update记录时是否选择插入新的文档,true为插入;multi也是可选参数,可选择只更新找到的第一条记录或者更新全部查找到的内容,前者为false后者为true,MongoDB中默认选false;writeConcern也是可选参数,可抛出异常。

将title是python的文档修改成title为“python爬虫”,示例如下所示:

以上示例只会修改第一条查找到的文档,如果需要修改多条文档,则设置参数multi为true,示例如下所示:

save()方法通过传入的文档来替换已有文档,方法原型如下:

其中,document参数是文档中的数据,writeConcern是可选参数,可抛出异常。下面通过替换_id为5b6fcffc90869c10bcab0e73的文档数据来演示该方法的使用,具体如下所示:

删除文档使用remove()方法,其方法原型如下:

remove()方法中的3个参数都是可选的:query为删除文档的条件;justOne若设为true或1,则只删除一个文档;writeConcern抛出异常。

将刚才更新的文档删除,即删除title为MongoDB的文档,示例如下:

若没有query条件则删除所有的文档,如图所示。

从图中可以看到,title为MongoDB的文档已被整个删除。

在Python中操作MongoDB

在Python中操作MongoDB首先需要安装pymongo模块。

1. 安装pymongo

使用pip命令安装pymongo,具体如下所示:

安装完成后如图所示。

pymongo安装成功后,使用时直接import即可。

2. 建立连接

pymongo模块使用MongoClient对象来描述一个数据库客户端,创建对象所需的参数主要是host和port。常见的3种形式如下所示:

第一种方式默认连接的是主机的IP和端口,第二种方式是显式地连接指定IP和端口,第三种是使用URL格式进行连接。

3. 获取数据库

一个MongoDB可以有多个独立的数据库。使用pymongo时,可以通过访问MongoClient属性的方式来访问数据库,具体如下所示:

如果数据库名称导致属性访问方式不能使用(比如pa-pers的形式),可以通过字典的方式访问数据库,具体如下所示:

4. 获取集合

一个collection即一组存在于MongoDB中的文档,获取collection的方法与获取数据库方法一致,具体如下所示:

或使用字典方式,具体如下所示:

值得注意的是,MongoDB中的collection和数据库都是惰性创建的。即前面介绍的命令实际并没有对MongoDB Server进行任何操作,直到第一个文档插入后,collection和数据库才会被创建,这也是在不插入文档之前使用“show dbs”命令查看不到之前创建的数据库的原因。

5. 插入文档

MongoDB中的数据以JSON类文件的形式保存。在pymongo中使用字典来代表文档,使用insert()方法插入文档,具体如下所示:

文档被插入后,如果文档中没有_id键值,系统会自动为文档添加。_id是一个特殊键值,该值在整个collection中是唯一的。使用insert()方法会返回这个文档的_id值。

使用insert()方法也可进行批量文档插入,具体如下所示:

6. 查询文档

MongoDB中查询一个文档时可使用find_one()函数,该函数会返回一个符合查询条件的文件,在没有匹配出结果时返回None,具体如下:

find_one()返回的文件中已经存在_id键值,该键值是由数据库自动添加。find_one()还支持对特定元素进行匹配查询,比如筛选出name为qianfeng的文档,具体如下所示:

也可以通过_id进行查询,返回为ObjectId的对象。比如查询student_id为5b6fcffc90869c10bcab0e79,具体如下所示:

在Web应用中经常通过查询_id从URL中抽取id,然后根据id从数据库中进行查询操作。

若需要查询多个文档,可以使用find()方法。find()方法返回一个Cursor实例,通过该实例可获取每个符合查询条件的文档。具体如下所示:

与使用find_one()函数类似,find()也可以使用条件查询来查找结果。比如查询姓名为qianfeng的学生,示例如下:

如果只想查询符合查询条件的文件的数量,可使用count()操作。比如查询age为20的学生数量,示例如下:

7. 修改文档

MongoDB中使用update()和save()方法来更新文档,具体如下所示:

8. 删除文档

MongoDB中使用remove()方法删除文档,具体如下所示: