1、MongoDB描述
MongoDB是一个基于分布式文件存储的NoSQL数据库,在处理海量数据的时候会比MySQL更有优势,爬虫如果上了一个量级,可能就会比较推荐使用MongoDB,当然没有上量的数据也完全可以使用MongoDB来存储数据,因此学会MongoDB也是爬虫工程师必须掌握的一个技能。
MongoDB官方文档:http://www.mongoing.com/docs/
1)文档
A)MongoDB是一个面向文档的数据库;
B)举例:{“foo”:3, “greeting”:“Hello,world!”};
C)区分大小写,且key唯一,不可重复,文档可嵌套。
2)集合
集合就是一组文档,文档类似于关系型数据库里的行,集合类似于关系型数据库里的表,集合中的文档无需固定额结构(与关系型数据库的区别)。
3)集合的命名
A)不能有空字符串(" ");
B)不能包含\0字符(空字符);
C)不能使用system.的前缀(系统保留);
D)建议不包含保留字 "$";
E)用 . 分割不懂命名空间的子集合(如:blog.users, blog.posts)。
4)数据库
A)多个文档组成集合,多个集合组成数据库;
B)一个实例可以承载多个数据库;
C)每个数据库都有独立的权限;
D)保留的数据名称(admin,local,config)。
2、安装MongoDB
从官网下载mis安装包,安装在根目录下MongoDB文件夹里就OK,例如:
D:\MongoDB\Server\4.2
。
3、启动MongoDB
A)创建数据目录:在启动MongoDB之前,首先要给MongoDB指定一个数据存储的路径,比如在MongoDB的安装路径下创建一个data文件夹,专门用来存储数据:
D:\MongoDB\Server\4.2\data
;
B)添加环境变量:将MongoDB的bin目录添加到环境变量中,方便后期调用;
C)启动MongoDB:执行命令mongod --dbpath D:\MongoDB\Server\4.2\data
启动。
4、连接MongoDB
A)使用CMD连接:在环境变量设置好的前提下,使用命令
mongo
就可以进入到MongoDB的操作终端了。
B)使用Compass连接:Compass是一个图形化操作MongoDB的客户端,使用Compass操作MongoDB会更加方便。
B)使用Navicat连接:Navicat是一个可以操作MySQL数据库非常方便的软件,使用Navicat操作数据库,就跟使用Excel操作数据是一样的。
5、将MongoDB制作成Windows服务
启动MongoDB后,如果想让MongoDB一直运行,那么这个终端便不能关闭,而且每次运行的时候还需要指定
data
目录,为了便于以后使用,可以将MongoDB制作成一个服务,以后通过一行命令就可以运行了。
A)创建配置文件:在MongoDB的安装路径下创建配置文件
mongod.cfg
(路径和名字可自行设置),然后在配置文件中添加如下代码:
logpath = D:\MongoDB\Server\4.2\data\logs\mongod.log
dbpath = D:\MongoDB\Server\4.2\data\db
说明:logpath是日志文件的路径,dbpath是MongoDB数据库的存储路径。
B)安装MongoDB服务:使用命令
mongod --config "cfg配置文件所在路径" --install
,比如mongod --config "D:\MongoDB\Server\4.2\mongod.cfg" --install
。
C)启动MongoDB服务:net start mongodb
。
D)关闭MongoDB服务:net stop mongodb
。
E)移除MongoDB服务:"D:\MongoDB\Server\4.2\bin\mongod.exe" --remove
。
7、MongoDB介绍
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | SQL:数据库 MongoDB:数据库 |
table | collection | SQL:数据库表 MongoDB:集合 |
row | document | SQL:数据记录行 MongoDB:文档 |
column | field | SQL:数据字段 MongoDB:域 |
index | index | SQL:索引 MongoDB:索引 |
table | joins | SQL:表连接 MongoDB:不支持 |
primary key | primary key | SQL: 主键 MongoDB:主键,自动将 _id 字段设置为主键 |
1)MongoDB三元素
A)数据库
B)集合(collection):就是关系型数据库中的表,可以存储多个文档,结构可以不固定,可以存储如下文档在一个集合中:
{"name": "aaa", "gender": "1"}
{"name": "bbb", "age": 18}
{"title": "ccc", "price": 20.9}
C)文档(document):就是关系型数据库中的一行,文档是一个对象,由键值对构成,是json的扩展形式:{'name': 'aaa', 'gender': '1'}
。
2)MongoDB操作命令
A)db:查看当前的数据库;
B)show dbs:查看所有的数据库;
C)use 数据库名:切换数据库,如果数据库不存在,则创建一个(创建完成后需要插入数据库才算创建成功);
D)db.dropDatabase():删除当前指向的数据库;
E)db.集合名.insert(value):添加数据到指定的集合中;
F)db.集合名.find():从指定的结合中查找数据。
注:更多命令请见http://www.runoob.com/mongodb/mongodb-tutorial.html
8、使用Python操作MongoDB
1)操作MongoDB需要使用的中间件:pymongo。
2)连接MongoDB并写入数据。
import pymongo
# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)
# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu
# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa
# 写入数据
collection.insert_one({"name": "Kevin", "age": 20, "job": "PM"})
MongoDB的数据类型:
类型 | 说明 |
---|---|
Object ID | 文档ID |
String | 字符串,最常用,必须是有效的UTF-8 |
Boolean | 存储一个布尔值,true或false |
Integer | 整数可以是32位或64位,这取决于服务器 |
Double | 存储浮点值 |
Arrays | 数组或列表,多个值存储到一个键 |
Object | 用于嵌入式的文档,即一个值为一个文档 |
Null | 存储Null值 |
Timestamp | 时间戳,表示从1970-01-01到现在的总秒数 |
Date | 存储当前日期或时间的UNIX时间格式 |
3)新增数据(Insert)
A)新增一条数据insert_one
/insert
,示例代码如下:
import pymongo
# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)
# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu
# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa
# 新增数据
person = {
"name": 'Jhon',
"age": 21,
"job": "IT"
}
# 插入数据到数据库
collection.insert_one(person)
B)新增多条数据insert_many
,示例代码如下:
import pymongo
# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)
# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu
# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa
# 新增数据
person = [{
"name": 'Jacky',
"age": 21,
"job": "IT"
},
{
"name": 'Jose',
"age": 24,
"job": "HR"
}]
# 插入数据到数据库
collection.insert_many(person)
4)查询数据(Find)
A)查询集合中所有数据find
,示例代码如下:
import pymongo
# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)
# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu
# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa
cursor = collection.find()
for data in cursor:
print(data)
运行结果:
{'_id': ObjectId('5e951d2d8841ab7f4f0dece0'), 'name': 'Kevin', 'age': 20, 'job': 'PM'}
{'_id': ObjectId('5e9533e97872f736c34c6ddb'), 'name': 'Jhon', 'age': 21, 'job': 'IT'}
{'_id': ObjectId('5e9534b8d1981fd527e13f83'), 'name': 'Jacky', 'age': 21, 'job': 'IT'}
{'_id': ObjectId('5e9534b8d1981fd527e13f84'), 'name': 'Jose', 'age': 24, 'job': 'HR'}
B)查询集合中的一条数据find_one
,示例代码如下:
import pymongo
# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)
# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu
# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa
data = collection.find_one({"age" : 20})
print(data)
运行结果:
{'_id': ObjectId('5e951d2d8841ab7f4f0dece0'), 'name': 'Kevin', 'age': 20, 'job': 'PM'}
5)更新数据(Update)
A)更新一条数据update_one
,示例代码如下:
import pymongo
# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)
# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu
# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa
collection.update_one({"name": "Kevin"}, {"$set":{"name": "Kely"}})
B)更新多条数据update_many
,示例代码如下:
import pymongo
# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)
# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu
# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa
collection.update_many({"name": "Kely"}, {"$set":{"name": "Kevin"}})
6)删除数据(Delete)
A)删除一条数据delete_one
,示例代码如下:
import pymongo
# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)
# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu
# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa
collection.delete_one({"name": "Jacky"})
B)删除多条数据delete_many
,示例代码如下:
import pymongo
# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)
# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu
# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa
collection.delete_many({"name": "Kevin"})