Python与MongoDB
在前面的文章中我们已经学习到了如何从网站中获取到数据,接下来我们就要开始学习如何将我们从网站中获取到的数据进行保存,存储的媒介是分为很多种的,例如:文本文档、excel、json、数据库等;本章主要是介绍数据库之一的MongoDB及其简单的增删改查操作。接下来我们先通过一段小小的介绍来看看什么是数据库。
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
目前NoSQL数据库仍然没有一个统一的标准,它现在有四种大的分类:
(1)键值对存储(key-value):代表软件Redis,它的优点能够进行数据的快速查询,而缺点是需要存储数据之间的关系。
(2)列存储:代表软件Hbase,它的优点是对数据能快速查询,数据存储的扩展性强。而缺点是数据库的功能有局限性。
(3)文档数据库存储:代表软件MongoDB,它的优点是对数据结构要求不特别的严格。而缺点是查询性的性能不好,同时缺少一种统一查询语言。
(4)图形数据库存储:代表软件InfoGrid,它的优点可以方便的利用图结构相关算法进行计算。而缺点是要想得到结果必须进行整个图的计算,而且遇到不适合的数据模型时,图形数据库很难使用。
一、mongodb安装
首先在官方网站下载MongoDB安装包,下载地址:
点击next,进入如下界面
勾选之后点击next,界面如下:
选择Custom(自定义安装),界面如下:
修改好安装目录(也可以不修改)之后点击next,界面如下:
直接next
然后再next
点击install,等待安装结束,安装完成之后添加bin目录到环境变量之中。
将上图所示目录添加到环境变量之中。
二、mongo常用操作
2.1 连接到mongo
打开终端(cmd),输入mongo如下图所示
2.2 查看数据库
查看所有数据库的语法如下
show dbs
可以看到默认情况下是存在三个库(安装好mongo之后自带的,不用管它的内容)。
2.3 创建数据库
创建数据库的语法格式如下:
use DATABASE_NAME
和mysql中切换数据库一样,只是在mongo中如果数据库不存在的话会创建数据库并切换到该数据库,否则直接切换到指定数据库
创建一个名为quanmou的数据库如下所示
use quanmou
若名为quanmou的数据库不存在则创建并切换到此数据库。
注意,再查看时,并不会显示出刚刚创建的数据库,如果要显示出来,我们还需要在里面插入一条数据之后才会显示。
2.4 删除数据库
语法如下:
db.dropDatabase()
删除当前数据库,默认为test,可以使用db命令来查看当前数据库名。
查看当前数据库名
执行删除数据库的命令:
2.5 创建集合
在MongoDB中使用createCollection()方法来创建集合。语法格式如下
db.createCollection(name, options)
参数说明:
- name:要创建的集合名称
- options:可选参数,制定有关内存大小及索引的选项
options可选的参数如下所示
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
在插入文档时,mongo首先检查固定集合的size字段,然后检查max字段。
在quanmou库中创建students集合:
如果要查看已有集合,可以使用show collections
或show tables
命令:
创建固定集合qmspider,集合空间大小为102400B,文档最大个数为10000。
2.6 删除集合
语法格式:
db.collection.drop()
返回结果:如果成功删除则返回true,否则返回false
可以看到集合中是不存在qmspider了的。
2.7 插入文档
MongoDB文档的数据结构和json基本是一样的,所有存储在集合中的数据都是BSON格式。BSON是一种类似于json的二进制形式的存储格式,是Binary JSON的简称。
插入的语法如下:
db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)
- save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
- insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。
db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
参数说明:
- document:要写入的文档。
- writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
- ordered:指定是否按顺序写入,默认 true,按顺序写入。
向students集合中插入一个文档:
也可以将数据定义为一个变量,然后再进行插入,如下图所示:
2.8 查询文档
在MongoDB中,查询文档使用的是find()方法。find()方法是以非结构化的方式来显示所有的文档。
语法格式如下:
db.collection.find(query, projection)
参数说明:
- query:可选,使用查询操作福指定查询条件
- projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值,只需要省略该参数即可(默认省略)
如果需要以易读的方式来读取数据,可以使用pretty()方法,语法如下:
db.collection.find().pretty()
pretty()方法以格式化的方式来显示所有文档
查询students集合中的数据:
也可以使用findOne()方法来返回一个文档
2.8.1 MongoDB 与 RDBMS Where 语句比较
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value> } | db.col.find({"by":"菜鸟教程"}).pretty() | where by = '菜鸟教程' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
MongoDB and条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
db.collection.find({key1:value1, key2:value2}).pretty()
2.8.2 MongoDB OR条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
查询name为xiaohong或者by为quanmou的文档
2.8.3 and和or联合使用
语法格式:
db.collection.find({‘key1’: ‘value1’, $or:[{‘key2’:‘value2’}, {‘key3’:‘value3’}]})
2.9 更新文档
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。
2.9.1 update()方法
update()方法用于更新已存在的文档。语法格式如下:
db.collection.update(query,update,{upsert: boolean,multi:boolean,writeConcern:document})
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
更新students集合中的内容:
2.9.2 save()方法
save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。语法格式如下:
db.collection.save(document,{writeConcern:document})
参数说明:
- document : 文档数据。
- writeConcern :可选,抛出异常的级别。
以下我们可以看到将xiaofang又替换回了xiaohong
2.10 删除文档
在MongoDB中,remove() 函数是用来移除集合中的数据。
MongoDB 数据更新可以使用 update() 函数。在执行 remove() 函数前先执行 find() 命令来判断执行的条件是否正确,这是一个比较好的习惯。
语法格式如下:
db.collection.remove(query,{justOne:Boolean,writeConcern:document})
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别。
默认情况下删除集合中所有匹配成功的文档,也就是说此处将所有name为xiaohong的文档全部删除了,所以集合中就不再有数据存在了。