前言
之前我们讲过关于 mysql 的数据存储:爬虫Day7-Mysql的那些事
对于爬虫的数据存储来说,一条数据可能存在某些字段提取失败而缺失的情况,而且数据可能随时调整,另外数据之间能还存在嵌套关系。如果我们使用了关系型数据库存储,一是需要提前建表,二是如果存在数据嵌套关系的话需要进行序列化操作才可以存储,比较不方便。如果用了非关系数据库就可以避免一些麻烦,简单高效。
MongoDB 是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似 Json 对象,它的字段值可以包含其他文档,数组及文档数组,非常灵活。在python中使用pyMongo模块进行交互。
Mongodb基础
名词比较
如果之前对 Mysql 有所了解,那么在 Mongodb中呢,对一些概念性东西就能一通百通了。下图是这两者的名词比较
- 在 Mongodb中,区别比较大的就是,他的表名词改为 collection (集合),且 所存的数据称为 document(文档)
Document
文档是一组键值(key-value)对(即 JSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点
集合
集合就是 MongoDB 文档组,集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
pyMongo模块
在对Mongodb有了初步的了解之后呢,我们就可以使用python 与 mongodb进行交互,进行操作了。
三步曲
- 连接 MongoDB 我们需要使用 PyMongo 库里面的 MongoClient,一般来说传入 MongoDB 的 IP 及端口即可,第一个参数为地址 host,第二个参数为端口 port,端口如果不传默认是 27017。
- MongoDB 中还分为一个个数据库,我们接下来的一步就是指定要操作哪个数据库
- MongoDB 的每个数据库又包含了许多集合 Collection,也就类似与关系型数据库中的表,我们需要指定要操作的集合
- 指定数据库或者指定集合可以使用client[‘test’] 和 db.[‘student’] 的形式进行指定(集合的结构造就了这种选择方式)
插入数据
insert_one(): 插入单条数据
- 其返回一个 InsertOneResult 对象 ,表示插入的数据,是个 ObjectId 对象。
insert_many():插入多条数据
- Insert_many( )传入的参数需要以列表形式传递(二维数据)
- 这个方式挺常用的,我们把抓取的每个数据用字典存储,再append 到一个列表中,最终使用 inser_many 进行一次性存储,非常方便。
查询数据
在爬虫中,数据存储最重要的是insert,但是数据查询也必不可少,比较我们需要查看数据是否插入成功嘛
find_one():
- find_one()里面传的参数可以为字典形式,其表明了限制条件,返回的result结果为 dict 类型
- 发现数据中多了个字段:“id”:“ObjectId”,MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象。ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes。
find():
- 返回结果是 Cursor 类型,相当于一个生成器。
- 我们需要遍历取到所有的结果,每一个结果都是字典类型。
更新数据
- Update_One 传入两个参数,第一个是查询条件,第二个是修改的数据(键为使用功能符号@进行选定的操作指令set,值为修改的数据)
- 如果调用 update_many() 方法,则会将所有符合条件的数据都更新。而update_one只是取第一条匹配的数据进行更新操作。
删除数据
- 删除数据 有 三个 API 供我们调用,操作与 update挺相像的
今天介绍了Mongodb这种NOSQL数据库的作用和特点,还有Mongodb的基本操作:增删改查。
ok,我们下期见,撒由那拉~