MongoDB的学习

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

  1. 鼠标移动到“Products”上,点击“Community Server”:
    在这里插入图片描述
  2. 在此处选择版本和平台进行下载:
    在这里插入图片描述
  3. 下载成功后双击该msi文件
    在这里插入图片描述
  4. 点击“Next”:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  5. 使用默认路径安装
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
6. 至此就安装成功了:
在这里插入图片描述

2. 添加环境变量

  • 将C:\Program Files\MongoDB\Server\4.4\bin目录添加到系统环境变量中。
    在这里插入图片描述
  • 测试环境变量是否添加成功:
    Win +R打开cmd窗口,输入“mongo”命令,能够看到MongoDB的版本信息:
    在这里插入图片描述

3. MongoDB概念介绍

SQL概念MongoDB概念解释
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield字段/域
indexindex索引
primary keyprimary key主键

4. MongoDB常用的命令

1. 启动MongoDB

  • 设置数据存放路径(可选):

mongod --dbpath C:\Program Files\MongoDB\Server\4.4\data
在这里插入图片描述

  • 链接MongoDB数据库:

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文档 -> 一行数据

  1. 不手动创建表(当没有这个表的时候,插入一条数据,表自动创建):

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. 查询数据

  1. 精确查找

db.mark.find({name: “mark”})

查找所有name值为“mark”的数据。

  1. 格式化的输出查询结果(美化输出)

db.mark.find({name: “mark”}).pretty()

在这里插入图片描述
3. 只查找第一条符合条件的数据

db.mark.findOne({name: “mark”})

在这里插入图片描述
4. 多条件查询
在这里插入图片描述
5. 返回条件查询

  • 查找年龄大于18的数据:

db.mark1.find({age: {$gt:18}})
在这里插入图片描述

  1. 通过定义方法来进行模糊查询:
  • 查找年龄大于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时,就会更新所有满足条件的数据。

  1. 整条数据都被更新:
    在这里插入图片描述
  2. 只更新一条数据的一部分:
    在这里插入图片描述
  3. 没有设置multi属性值时,默认只修改一条数据
    在这里插入图片描述
  4. 设置multi属性,一次性更改多条数据:
    在这里插入图片描述

7. 删除数据

db.集合名.remove(查询条件)
db.集合名.remove({条件}, {justOne: true})
db.集合名.deleteOne(查询条件)
db.集合名.deleteMany(查询条件)

  1. 删除集合中的所有数据:
    在这里插入图片描述
  2. 仅删除集合中满足条件的第一条数据:
    在这里插入图片描述
    在这里插入图片描述
  3. 删除多条符合条件的数据:
    在这里插入图片描述
    在这里插入图片描述

5. MongoDB创建索引

1. 为什么需要创建索引?

  • 加快查询速度。
  • 进行数据的去重复。

2. MongoDB创建简单的索引方法

db.集合名.ensureIndex({属性: 1})

1表示升序,-1表示降序。(将该属性字段作为索引)

3. 创建索引前后查询速度对比

  • 测试:插入10万条数据到数据库中。
    插入数据:
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")   # 显示查询操作的详细信息

在这里插入图片描述
在这里插入图片描述

  • 使用了37毫秒。

创建索引:

db.test.ensureIndex({name: 1})

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 使用了4毫秒。

4. 查看哪些属性上被创建了索引

db.集合名.getIndexes()

在这里插入图片描述

  • 默认情况下,_id是集合的索引。

6. 推荐的一个好用的命令行软件——Cmder(可以不用它)

1. 下载Cmder

官网:https://cmder.net/

  1. 点击下载Mini版:
    (完整版功能多,但比较大)
    在这里插入图片描述
  2. 将文件解压,放在D盘根目录下:
    在这里插入图片描述

2. 添加Cmder的环境变量

将cmder_mini文件目录添加到系统环境变量中。
在这里插入图片描述

3. 将Cmder启动程序添加到右键菜单中

  1. 打开D盘的Cmder目录,以管理员身份运行Cmder.exe文件
    在这里插入图片描述
  2. 在打开的Cmder终端中输入如下命令:

Cmder.exe/REGISTER ALL
在这里插入图片描述
在任意地方再次点击右键,就能看到Cmder的快捷运行选项。
在这里插入图片描述

6. Python与MongoDB交互

1. 步骤

1. 安装pymongo
  • 在终端内输入命令:

pip install pymongo

2. 导入模块并使用
# 1. 需要先安装pymongo模块:pip install pymongo
import pymongo    # 2. 导入模块


# 3. 创建MongoDB的链接:
# mongo_client = pymongo.MongoClient()   # 默认会链接本地的MongoDB数据库
mongo_client = pymongo.MongoClient(host="127.0.0.1", port=27017)   # 可以设置主机IP和端口,链接远程的MongoDB 数据库

# 4. 创建数据库和数据集合,并向集合中插入数据:
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]   # "demo1"是数据库名,name是数据表名

    # 定义添加一条数据的方法
    def add_one(self, a_data_dict):
        # 注意:高版本中只有insert_one()和insert_many()方法,没有insert()方法
        result = self.db.insert_one(a_data_dict)
        print(result)

    # 定义添加多条数据的方法
    def add_many(self, data_dicts_list):
        # 注意:高版本中只有insert_one()和insert_many()方法,没有insert()方法
        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]   # "demo1"是数据库名,name是数据表名

    # 定义添加一条数据的方法
    def add_one(self, data):
        # 注意:高版本中只有insert_one()和insert_many()方法,没有insert()方法
        result = self.db.insert_one(data)
        print(result)

    # 定义添加多条数据的方法
    def add_many(self, data_list):
        # 注意:高版本中只有insert_one()和insert_many()方法,没有insert()方法
        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}
    # mongoDB1.add_one(data1)

    # 插入多条数据:
    data_list1 = [{"name": "芥川龙之介"}, {"name": "村上春树"},
                 {"name": "龙之峰帝人", "age": 17, "job": "学生"},
                 {"name": "平和岛静雄", "age": 23, "job": "酒保"},
                 {"name": "结城新十郎", "age": 27, "job": "侦探"}
                 ]
    # mongoDB1.add_many(data_list1)

    # 获取一条数据:
    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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值