1. MongoDB概述
1. MongoDB是什么?
- 是一种非关系型数据库(NoSQL)(即not only sql)。
2. 为什么需要学习?
- 企业需求
- 爬取数据到一个量级,使用MongoDB比mysql要好一些。
3. MongoDB的特点
- 无数据结构(方便爬虫)(没有固定表结构的约束)
- 高性能(具有非常高的读写能力)
- 良好支持(有完善的文档,跨平台,稳定)
2. MongoDB的安装
1. 进入官网,选择版本安装(建议安装4.4版本的)
MongoDB官网:https://www.mongodb.com/ 下载网址:https://www.mongodb.com/try/download/community
- 鼠标移动到“Products”上,点击“Community Server”:
- 在此处选择版本和平台进行下载:
- 下载成功后双击该msi文件
- 点击“Next”:
- 使用默认路径安装
6. 至此就安装成功了:
2. 添加环境变量
- 将C:\Program Files\MongoDB\Server\4.4\bin目录添加到系统环境变量中。
- 测试环境变量是否添加成功:
Win +R打开cmd窗口,输入“mongo”命令,能够看到MongoDB的版本信息:
3. MongoDB概念介绍
SQL概念 | MongoDB概念 | 解释 |
---|
database | database | 数据库 | table | collection | 数据库表/集合 | row | document | 数据记录行/文档 | column | field | 字段/域 | index | index | 索引 | primary key | primary key | 主键 |
4. MongoDB常用的命令
1. 启动MongoDB
mongod --dbpath C:\Program Files\MongoDB\Server\4.4\data
mongo
2. 基本命令
命令 | 功能 |
---|
show dbs | 展示当前所有的数据库 | cls | 清屏命令 | use 数据库名 | 使用某个数据库/创建数据库(当数据库不存在的时候就创建,但如果数据库里面不放任何东西就不会成功创建) | db | 查看当前使用的数据库的名称 | db.dropDatabase() | 删除当前所在的数据库 | show collections | 查看当前数据库下面的所有数据集合(相当于表) | show tables | (推荐使用上面一行的方式)查看当前数据库下面的所有数据集合(相当于表) | db.集合名.insert(数据字典(单条数据)/数据字典列表(插入多条数据)) | 向集合中插入数据(没有集合,则该集合会被自动创建) | db.集合名.insertOne() | 插入一条数据 | db.集合名.insertMany() | 插入多条数据 | db.createCollection(集合名, {capped: true, size: 数值, max: 数值}) | 手动创建集合,可以添加一些配置项,如设置上限等 | db.集合名.find() | 查看集合中的所有数据 | db.集合名.find().count() | 查看集合中的数据条数 | db.集合名.count() | 查看集合中的数据条数 | db.集合名.drop() | 删除当前的整个集合 | db.集合名.isCapped() | 检测集合是否设置上限,true表示有上限,false表示没有上限 | db.集合名.findOne({条件}) | 查找第一条符合条件的数据 | db.集合名.find({条件}) | 查找所有符合条件的数据 | db.集合名.find({条件}).count() | 查找所有符合条件的数据的条数 | db.集合名.count({条件}) | 查找所有符合条件的数据的条数 | db.集合名.find({条件}).prrety() | 查找所有符合条件的数据,prrety()的作用是美化输出结果 | db.集合名.find().limit() | 返回该表中的所有数据 | db.集合名.find().limit(数字) | 返回该表中的前几条数据(数字不分正负,都是前几条) | db.集合名.find().skip(数字1).limit(数字2) | 跳过前“数字1”条数据,只显示剩下的前“数字2”条数据 | db.集合名.find({}, {字段1: 1, _id: 0}) | (映射)只显示字段1,也不显示_id字段(1表示显示,0表示不显示) | db.集合名.find().sort({字段: 1}) | 按照指定字段默认进行升序排序(从小到大) | db.集合名.find().sort({字段: -1}) | 按照指定字段默认进行降序排序(从大到小) | db.集合名.update({被更新的数据的字段条件}, {目标数据}) | 整条数据被更新,一条数据中原有的其他数据不保留,只更新一条数据 | db.集合名.update({被更新的字段条件}, {$set: {部分更新数据}}) | 指定的字段被更新,一条数据中原有的其他数据能够保留,只更新一条数据 | db.集合名.update({被更新字段条件}, {$set: {替换成的内容}}, {multi: true}) | 同时更新多条符合条件的数据 | db.集合名.remove({}) | 删除集合中的全部数据,集合仍然是存在的,只不过为空集合 | db.集合名.remove({条件}, {justOne: true}) | 仅删除满足条件的第一条数据 | db.集合名.deleteOne({条件}) | 删除一条满足条件的数据,效率要比remove()高 | db.集合名.deleteMany({条件}) | 删除多条满足条件的数据,效率要比remove()高 | db.集合名.ensureIndex({属性: 1}) | 在该属性上创建索引 | db.集合名.find(查询条件).explain(“executionStats”) | 查看执行查找的状态,能够看见查询耗费了多长时间 | db.集合名.getIndexes() | 能查看集合上的哪些属性上被创建了索引(运行结果是一个索引对象列表) |
有find()和count()时,当count()有条件,find()无条件时,count()中的条件不起任何作用: 跳过数据的方式: 显示部分字段内容:(映射) 升降排序:(1是升序,-1是降序)
3. 插入数据
1. insert()
Collection 集合 -> 表 Document文档 -> 一行数据
- 不手动创建表(当没有这个表的时候,插入一条数据,表自动创建):
db.mark.insert({x:1})
非手动创建的集合能插入的数据条数没有上限,且不能设置上限。(可无限插入数据) 2. 手动创建集合: 手动创建的集合可以设置上限。
db.createCollection(name, options) name:创建的集合名称 optitions:一个文档(即字典),指定集合的配置
capped:Boolean类型,默认是False,即没有上限。设置为True时就有上限。 size:number,设置的上限大小。大小以字节为标准,而非数据条数。如果设置的大小小于256,默认,就按照256B(字节)计算。 max:number,指定上限集合中允许的最大文档数量(即数据有多少行)。
一般不设置上限。 db.createCollection(“mark3”, {capped:true, size:50, max:4})
- size属性设置的不是数据条数限制,而是数据字节大小的限制。
- 如果设置了max值,超过了max的条数的插入时,新插入进去的内容会将最先插入的内容替换掉:
- 查看表是否设置上限:
- 一次性插入多条数据
利用循环一次性插入多条数据:
for(i=3;i<10;i++)db.mark.insert({x:i})
2. save()(插入/修改数据)
db.mark.save({_id: 1, name: “lv”})
- 根据_id查找,如果_id值已经存在,就更新内容。如果_id值不存在,就插入该条数据。
4. 查询数据
- 精确查找
db.mark.find({name: “mark”})
查找所有name值为“mark”的数据。
- 格式化的输出查询结果(美化输出)
db.mark.find({name: “mark”}).pretty()
3. 只查找第一条符合条件的数据
db.mark.findOne({name: “mark”})
4. 多条件查询 5. 返回条件查询
db.mark1.find({age: {$gt:18}})
- 通过定义方法来进行模糊查询:
db.mark1.find({$where: function(){return this.age>18}})
7. insertOne()的使用:
5. 运算符
1. 比较运算符
比较运算符含义 | 运算符 |
---|
等于 | 默认是等于判断,没有运算符 | 小于 | $lt | 小于等于 | $lte | 大于 | $gt | 大于等于 | $gte |
查询y大于等于18的数据 db.jerryn_collection.fiind({y: {$gte: 18}})
2. 范围运算符
使用$in判断是否在某个范围内查询年龄为18、28的学生。
- 满足条件中的一个就返回:(年龄大于18或者家住安阳)
db.mark1.find({$or: [{age: {$gt: 18}}, {home: "安阳"}]})
- 同时满足多个条件:(年龄大于等于18,并且家住安阳)
db.mark1.find({$and: [{age: {$gte: 18}}, {home: "安阳"}]})
6. 修改数据
db.集合名.update()
query:查询条件 update:更新的内容 multi:默认为False,表示只更新第一个符合条件的数据。设置为True时,就会更新所有满足条件的数据。
- 整条数据都被更新:
- 只更新一条数据的一部分:
- 没有设置multi属性值时,默认只修改一条数据
- 设置multi属性,一次性更改多条数据:
7. 删除数据
db.集合名.remove(查询条件) db.集合名.remove({条件}, {justOne: true}) db.集合名.deleteOne(查询条件) db.集合名.deleteMany(查询条件)
- 删除集合中的所有数据:
- 仅删除集合中满足条件的第一条数据:
- 删除多条符合条件的数据:
5. MongoDB创建索引
1. 为什么需要创建索引?
2. MongoDB创建简单的索引方法
db.集合名.ensureIndex({属性: 1})
1表示升序,-1表示降序。(将该属性字段作为索引)
3. 创建索引前后查询速度对比
for(i=0;i<100000;i++){db.test.insert({name: 'test'+i, age: i})}
创建索引前:
db.test.find({name: 'test9999'})
db.test.find({name: 'test9999'}).explain("executionStats")
创建索引:
db.test.ensureIndex({name: 1})
4. 查看哪些属性上被创建了索引
db.集合名.getIndexes()
6. 推荐的一个好用的命令行软件——Cmder(可以不用它)
1. 下载Cmder
官网:https://cmder.net/
- 点击下载Mini版:
(完整版功能多,但比较大) - 将文件解压,放在D盘根目录下:
2. 添加Cmder的环境变量
将cmder_mini文件目录添加到系统环境变量中。
3. 将Cmder启动程序添加到右键菜单中
- 打开D盘的Cmder目录,以管理员身份运行Cmder.exe文件
- 在打开的Cmder终端中输入如下命令:
Cmder.exe/REGISTER ALL 在任意地方再次点击右键,就能看到Cmder的快捷运行选项。
6. Python与MongoDB交互
1. 步骤
1. 安装pymongo
pip install pymongo
2. 导入模块并使用
import pymongo
mongo_client = pymongo.MongoClient(host="127.0.0.1", port=27017)
mongo_client['demo_pycharm']['info'].insert_one({"name": "lvcx"})
2. 以面向对象的方式来让Python与MongoBDB交互
import pymongo
class MongoData(object):
def __init__(self, name):
self.client = pymongo.MongoClient(host="127.0.0.1", port=27017)
self.db = self.client['demo1'][name]
def add_one(self, a_data_dict):
result = self.db.insert_one(a_data_dict)
print(result)
def add_many(self, data_dicts_list):
result = self.db.insert_many(data_dicts_list)
print(result)
if __name__ == "__main__":
mongoDB1 = MongoData("users")
data1 = {"name": "lvcx", "age": 23}
mongoDB1.add_one(data1)
data_list = [{"name": "芥川龙之介"}, {"name": "村上春树"},
{"name": "龙之峰帝人", "age": 17, "job": "学生"},
{"name": "平和岛静雄", "age": "23", "job": "酒保"},
{"name": "结城新十郎", "age": 27, "job": "侦探"}
]
mongoDB1.add_many(data_list)
增加了查询数据的方法:
import pymongo
class MongoData(object):
def __init__(self, name):
self.client = pymongo.MongoClient(host="127.0.0.1", port=27017)
self.db = self.client['demo1'][name]
def add_one(self, data):
result = self.db.insert_one(data)
print(result)
def add_many(self, data_list):
result = self.db.insert_many(data_list)
print(result)
def get_one(self, query=None):
if query is None:
return self.db.find_one()
else:
return self.db.find_one(query)
def get_many(self, query=None):
if query is None:
return self.db.find()
else:
return self.db.find(query)
if __name__ == "__main__":
mongoDB1 = MongoData("users")
data1 = {"name": "lvcx", "age": 23}
data_list1 = [{"name": "芥川龙之介"}, {"name": "村上春树"},
{"name": "龙之峰帝人", "age": 17, "job": "学生"},
{"name": "平和岛静雄", "age": 23, "job": "酒保"},
{"name": "结城新十郎", "age": 27, "job": "侦探"}
]
res1 = mongoDB1.get_one({"name": "结城新十郎"})
print(res1)
res2 = mongoDB1.get_many({"age": 23})
for item in res2:
print(item)
运行结果:
C:\Users\lv\Desktop\13期爬虫\venv\Scripts\python.exe "C:/Users/lv/Desktop/13期爬虫/Course/11. 使用MongoDB/2. 以面向对象的写法来使用MongoDB数据库.py"
{'_id': ObjectId('62456978481b381fe05d2b3e'), 'name': '结城新十郎', 'age': 27, 'job': '侦探'}
{'_id': ObjectId('624565972175a5fe64253eb7'), 'name': 'lvcx', 'age': 23}
{'_id': ObjectId('62456978481b381fe05d2b39'), 'name': 'lvcx', 'age': 23}
{'_id': ObjectId('62456dcab4f6ae51d64b8928'), 'name': '平和岛静雄', 'age': 23, 'job': '酒保'}
Process finished with exit code 0
|