NoSQL,全称为Not Only SQL,不仅仅是SQL,泛指非关系型数据库。
NoSQL是基于键值对的存储,不需要进行SQL层的解析,数据之间没有耦合性,性能高。
非关系型数据库可以分为以下几类:
![3c30ce5a4baea4af79983d074b4a999e.png](https://i-blog.csdnimg.cn/blog_migrate/208d50c61016ea07151893b3864689ca.jpeg)
对于爬虫爬取的数据来说,可能会有数据缺失、数据结构嵌套等情况,如果使用关系型数据库村粗的话,需要提前建表,而且表之间的关系关系,数据的序列化等都比较麻烦。如果使用非关系型数据库存储的话,就比较方便了。
本节主要讲解MongoDB的使用。 MongoDB是一个C++编写的、基于分布式文件存储的开源的非关系型数据库系统。其内容存储形式类似于JSON对象,非常灵活。
1. 准备工作
需要安装MongoDB和PyMongo库,第一节“环境配置”都有讲,这里略过。
2. 连接MongoDB
我们使用PyMongo中的MongoClient来连接MongoDB。
![c79306acf948d8af7eebf6f007618612.png](https://i-blog.csdnimg.cn/blog_migrate/a21d54d87ee938df156ec622309597a5.jpeg)
另外,还可以使用下面这种方式连接MongoDB。
![86e4d05f7316615acf65b84eeddb00bb.png](https://i-blog.csdnimg.cn/blog_migrate/4143c369755c2607622551ed11d22eee.jpeg)
3. 指定数据库
MongoDB中一般存在很多数据库,怎么指定我们需要操作的数据库呢?
![50709e3dcaede996017067161335b42a.png](https://i-blog.csdnimg.cn/blog_migrate/03bdb1ae35ed6b6b61b0672a06ffe4f2.jpeg)
也可以使用这种方式指定。
![a5d0789840d26ad5a06eab69ae653edb.png](https://i-blog.csdnimg.cn/blog_migrate/6174853172ec4073ec993beacd71367c.jpeg)
4. 指定集合
每个数据库包含很多的集合,集合就相当于关系型数据库中的表,怎么指定我们操作的集合呢?
![8e784d8e44894ef9f7445cac726c4747.png](https://i-blog.csdnimg.cn/blog_migrate/dcd2f35df3f2700e04ce40dbc89be7dd.jpeg)
也可以这样写,等价于上面。
![c7a3480a09b42ef9004f258c2572ffd8.png](https://i-blog.csdnimg.cn/blog_migrate/4a0df8a3e460d61ae4374c5e17e1a87d.jpeg)
5. 插入数据
对于上面的person集合,演示一下怎么插入一条数据。
![e794b395671918ecc9d8a8b2eb11e154.png](https://i-blog.csdnimg.cn/blog_migrate/e90980aefebf313dcb51f3de46c3718a.jpeg)
执行结果如下:
![7ef11b4c0260286a0783f4d72d6592a0.png](https://i-blog.csdnimg.cn/blog_migrate/d4f04a5bca3a1b9b8d05160489c48af0.jpeg)
如果插入多条数据呢?我们可以使用insert_many().
![9b27bec26433e37d89b1a1de56659129.png](https://i-blog.csdnimg.cn/blog_migrate/8d2b4371f7219c7cd3624f0e81a79846.jpeg)
执行结果如下:
![b4e517e981e003f126f3f7650f6c9add.png](https://i-blog.csdnimg.cn/blog_migrate/f790a05050e1785170eadfe9b394ae6f.jpeg)
6. 数据查询
可以使用find_one()方法或find()方法进行查询.
find_one()返回单个结果,find()返回的是生成.
![1dffd7f7590e22799a7ced2e12a6baea.png](https://i-blog.csdnimg.cn/blog_migrate/fe8521e74b18eb9f1a49e819201edb7f.jpeg)
这里查询name='Amy'的人, 其返回类型为字典类型.
![b4be9bd374e35378bead6defc89eb2fb.png](https://i-blog.csdnimg.cn/blog_migrate/6107bbcf934b342017f6d3c494ccddaf.jpeg)
如果要查询多条结果,使用find()方法.
![a4acd0d2d01dbbf19dd609a5b74197e2.png](https://i-blog.csdnimg.cn/blog_migrate/3c71cfa60ba16e37e6a5d0ce59095e92.jpeg)
执行结果如下:
![adcf5637c312e924bb06dbe2291c8755.png](https://i-blog.csdnimg.cn/blog_migrate/5496f59b74b234e183e2d9017153d8ed.jpeg)
如果要返回年龄大于20的数据,怎么写呢?
![ac1a6f5b2d6c2e4b2f4f7092bcf845f3.png](https://i-blog.csdnimg.cn/blog_migrate/25b994b4e4dc0a6d7fd8893cf4755acb.jpeg)
$gt表示大于号,其他比较符号如下所示:
![6db02c1b13d7ba1e788c19ec6117494e.png](https://i-blog.csdnimg.cn/blog_migrate/86994b36039d05f238c75958f75fadac.jpeg)
另外还可以使用正则匹配:
![fee8f7f1780ae3022b16915ee3201ef3.png](https://i-blog.csdnimg.cn/blog_migrate/0b0111b9b7def9b3e56263e9eef8461a.jpeg)
下面是一些特殊符号的说明:
![5852c0ae4ffe76a6cc3a23eb8a89890d.png](https://i-blog.csdnimg.cn/blog_migrate/12858e81f45503d71d063c0fbbd28d67.jpeg)
7. 计数
调用count_documents()方法,就可以查询有多少条数据。
![fca43d15eea0d155e09afed7c8a0bb81.png](https://i-blog.csdnimg.cn/blog_migrate/27769c1af4fee59d0380c99e0c183c18.jpeg)
如果统计符合某条件的数据的数量,可以传入条件:
![0d12fae4e815afb0ef7bb9b420f85d50.png](https://i-blog.csdnimg.cn/blog_migrate/970fcedc13f91480c7993fa7c7b3dd7b.jpeg)
8. 排序
直接调用sort()方法就可以排序,传入参数可以设置其为升序还是降序:
![8b17ccb406bf8d715a9c33007c5bfb01.png](https://i-blog.csdnimg.cn/blog_migrate/3a1ce7773e265888a8479684416a5e43.jpeg)
执行结果如下:
![abf8ad6fe4fefdc280098df6351ed888.png](https://i-blog.csdnimg.cn/blog_migrate/ce459ae0ed65ded23afcd81f3ef913e2.jpeg)
9. 偏移
如果我们只想取某几个元素或某些元素,可以使用skip()方法跳过一些元素,取到我们需要的元素:
![a9791d448b4f4bff98c0cf3a1a1c48fe.png](https://i-blog.csdnimg.cn/blog_migrate/afc1862003b972064dca706744c51f17.jpeg)
还可以使用limit()方法指定要取的结果的个数。
![264138caeae37d8404519d1fcb979b56.png](https://i-blog.csdnimg.cn/blog_migrate/4b574b0a7944afa5cd5bc2c47475d7f7.jpeg)
10. 更新
使用update_one和updae_many()方法就可以更新数据,只需要指定更新的条件和更新后的数据。
![d299a04d485b830e4403587a4d07103f.png](https://i-blog.csdnimg.cn/blog_migrate/d92521fb4722cb4762bb56c1ce6346b8.jpeg)
还可以指定某个条件,给其age加1:
![d486af72df8db8890220dc93fbfce87a.png](https://i-blog.csdnimg.cn/blog_migrate/5f1c7dd4ffa2b44b87032a5334b99f53.jpeg)
上面调用的find_one()和update_one()方法,如果批量更新的话,可以这样:
![b3ea0e758027749982e08f8afe94929d.png](https://i-blog.csdnimg.cn/blog_migrate/9e70d1602de3111ea9f1e80b28e3d2d1.jpeg)
11. 删除
删除操作比较简单,直接调用delete_one()或者delete_many()方法,传入条件即可,符合条件的所有数据都会被删除。
![b5a3567ffc8f8c74be536eb98d51cf6a.png](https://i-blog.csdnimg.cn/blog_migrate/c2bf43ab430772a4eff000f3295acb6f.jpeg)
12. 其他
PyMongo还提供了一些其他的方法,如find_one_and_delete()、find_one_and_replace()、
find_one_and_update()、create_index()、create_indexes()、drop_index()等。
不再一一赘述,有需要的话请查询PyMongo文档。