MongoDB 玩转数据实践课

用 Python 操控数据库 · 开启全自动数据之旅

纯动手实践环节:请大家打开电脑,跟着敲!

今天的 90 分钟怎么安排?

Rocket

敲代码,看效果,不怕报错!

实践路线图

  • 热身准备 (10%): 装配我们的 Python “武器库”。
  • 核心战斗 (70%): 手把手用 Python 实现数据的增、删、改、查(CRUD)。这是今天绝对的重点!
  • 运维体验 (10%): 敲两行神级命令,体验企业级的数据备份与恢复。
  • 终极挑战 (10%): 独立完成一个“电商数据小项目”,检验学习成果。

提示:基础薄弱的同学不用怕,今天的代码我们会一行一行拆开揉碎了讲!

第一阶段:热身与环境准备

磨刀不误砍柴工

步骤 1:安装“翻译官” PyMongo

上节理论课我们说过,Python 不懂 MongoDB 的语言,我们需要请一位翻译官 —— PyMongo 库。

动手操作: 请打开你的 PyCharm(或命令行),在终端输入以下命令:

Terminal
(venv) C:\Users\Student> _
如果出现 "Requirement already satisfied" 是什么意思?(点击刮开)
恭喜你,这说明你的电脑里已经安装好啦,可以直接进入下一步!

步骤 2:建立连接 (连接字符串)

编写你的第一段 Python 代码

新建一个 demo.py 文件,敲入以下代码:

import pymongo

# 1. 建立与数据库的连接 (填入你的IP和端口)
client = pymongo.MongoClient("mongodb://localhost:27017/")

# 2. 测试一下是否连通
print(client.server_info())
            

小白课堂:代码解析

  • import pymongo:把刚刚安装的翻译官请进代码里。
  • MongoClient(...):拨打电话。localhost 代表本机,27017 是 MongoDB 默认的门牌号(端口)。
  • server_info():这是去问数据库“你在吗?”,如果运行没报错且打印出一大串信息,说明连接成功!

第二阶段:核心增删改查 (CRUD)

让数据在代码中流动起来

步骤 3:锁定“数据库”与“集合”

连接上服务器后,我们要告诉它:往哪个库哪张表里写数据?

1

选定数据库 (Database)

db = client["school"]

如果 school 库不存在,MongoDB 会在稍后存数据时自动帮你创建,非常省心!

2

选定集合 (Collection)

col = db["students"]

集合就相当于 MySQL 里的“表”。同样,不存在也会自动创建。

接下来的所有操作,我们都将基于 col 这个变量进行!

Create:插入单条数据 (insert_one)

字典与 BSON 的完美结合

# 1. 准备一条数据 (Python 字典)
student1 = {
    "name": "李四",
    "age": 20,
    "major": "大数据技术",
    "score": 88
}

# 2. 执行插入操作
result = col.insert_one(student1)

# 3. 打印系统自动分配的 ID
print("插入成功,ID为:", result.inserted_id)
            

敲黑板:重点解析

  • 在 Python 里,数据就是最普通的字典 { }
  • 调用 insert_one() 方法,直接把字典塞进去即可。
  • MongoDB 会贴心地为每一条数据自动生成一个独一无二的 _id,防止数据重复。

请大家运行这段代码,看到打印出的 ID 就算成功!

Create:批量插入数据 (insert_many)

一条条写太慢了,如果爬虫抓到了1000条数据怎么办?用 列表包含字典 的格式,一次性插入!

# 1. 准备多条数据 (放到一个列表 [ ] 里)
student_list = [
    {"name": "王五", "age": 19, "major": "软件工程", "score": 95},
    {"name": "赵六", "age": 21, "major": "大数据技术", "score": 72},
    {"name": "钱七", "age": 20, "major": "人工智能", "score": 60}
]

# 2. 执行批量插入
res = col.insert_many(student_list)

# 3. 看看插入了多少条?
print("批量插入成功!生成的ID有:", res.inserted_ids)
            

实践时间:把这段代码加到你的 demo.py 里并运行。

Read:初探查询 (find_one & find)

找一个人 vs 找一群人

  • find_one():只返回匹配到的第一条数据。
  • find():返回所有匹配的数据(由于数据可能很多,它返回的是一个迭代器,需要用 for 循环打印)。

# 找出一个叫王五的人
result = col.find_one({"name": "王五"})
print(result)

打印所有数据

# 括号里什么都不写,代表查询所有
all_students = col.find()

for stu in all_students:
    print(stu)
            

* 别忘了用 for 循环,否则你只会打印出一个游标对象(Cursor)哦!

Read:高级条件查询 (进阶必学)

老板要求:“把分数大于 80分的学生给我找出来!” 怎么做?

$gt (大于)

{"score": {"$gt": 80}}

Greater Than 的缩写

$lt (小于)

{"score": {"$lt": 60}}

Less Than 的缩写 (不及格抓出来)

$in (包含在)

{"major": {"$in": ["软件", "大数据"]}}

只要匹配列表里任何一个就行

# 动手实验:查询分数大于 80 分的学生
query = {"score": {"$gt": 80}}
for stu in col.find(query):
    print(stu['name'], "是学霸!")
            

Update:更新数据 (update_one)

关键语法:$set

更新数据需要两个参数:

  1. 条件: 要改谁?(比如找名叫"钱七"的人)
  2. 动作: 改成什么样?(务必使用 $set 操作符)

危险操作警告: 如果不写 $set,这条数据会被直接整条替换掉,只剩下你新写的字段!

# 任务:钱七同学补考通过了,分数改成 65 分
condition = {"name": "钱七"}
new_value = {"$set": {"score": 65}}

# 执行更新
col.update_one(condition, new_value)

print("修改完毕,大家可以用 find() 验证一下!")
            

Delete:删除数据 (delete_one)

有同学退学了,我们需要把他的数据清理掉。这个操作很简单,但要极其小心

删一条 (delete_one)

col.delete_one({"name": "李四"})

只删除匹配到的第一条。比较安全。

删一批 (delete_many)

col.delete_many({"score": {"$lt": 60}})

把所有不及格的同学全删了!(威力巨大)

想一想:如果执行 `col.delete_many({})` 会发生什么?(刮开看恐怖真相)
恭喜你,删库跑路成就达成!所有数据瞬间灰飞烟灭!千万别瞎敲!

CRUD 阶段小结:你已经掌握了核心武功!

C (Create): insert_one() / insert_many()

R (Read): find_one() / find()

U (Update): update_one()$set

D (Delete): delete_one() / delete_many()

大数据开发工程师每天写的数据清洗、爬虫入库,底层就是这四个基本动作的排列组合!

第三阶段:高可用与运维体验

告别单机玩具,体验企业级真功夫 (简单体验版)

体验 1:集群搭建 (了解原理)

为什么要有复制集和分片?

刚才我们敲的代码都是在“单机”上跑的。如果你的电脑硬盘坏了,刚才录入的“学霸王五”就没了。

  • 复制集 (Replica Set): 多台电脑互相拷贝,一台坏了另一台顶上(防丢失)。
  • 分片 (Sharding): 数据太大装不下,切成好几份存在不同电脑上(扩容量)。

复制集初始化暗号

(在 mongo shell 终端输入,仅作演示了解)

> rs.initiate()
{
    "info2" : "no configuration specified...",
    "ok" : 1
}
> rs.add("192.168.1.102:27017")
            

通过 rs.initiate() 和 rs.add(),我们就能把多台电脑绑成一个不会宕机的坚固阵营。

体验 2:数据备份与恢复 (重点操作)

哪怕有了复制集,如果有程序员手滑执行了 delete_many({}),所有机器的数据也会瞬间同步消失。我们需要冷备份

备份 (导出)

打开系统命令行(不是Python, 不是mongo),敲入:

mongodump -d school -o ./my_backup

这会把 school 库变成文件,塞进 my_backup 文件夹。

恢复 (导入)

如果数据被删了,用这个命令把文件夹里的数据倒回数据库:

mongorestore -d school ./my_backup/school

时光倒流,数据起死回生!

第四阶段:终极挑战课设

脱离教材,独立完成企业级小需求

挑战背景:你入职了一家“宠物商城”

Dog Cat

不再是刚才的学生分数表了,换个场景试试!

项目需求单

老板要求你编写一个 Python 脚本(新建一个名为 shop_task.py 的文件),全自动完成以下四步操作:

  • 要求1: 连接本机的 MongoDB。
  • 要求2: 选用数据库 pet_shop,选用集合 pets
  • 要求3: 批量插入至少 3 条宠物数据。
  • 要求4: 写一段查询逻辑并打印结果。
  • 要求5: 写一段更新逻辑。

具体任务拆解 (边看边敲)

1. 插入数据 (insert_many)

将以下数据结构转换为 Python 列表并插入:
- 姓名: 旺财, 种类: 狗, 价格: 500
- 姓名: 喵喵, 种类: 猫, 价格: 800
- 姓名: 大黄, 种类: 狗, 价格: 300

2. 筛选打印 (find)

老板想看店里所有的“狗”
请用 find() 加上条件 `{"种类": "狗"}`,并用 for 循环把找出来的宠物名字打印在屏幕上。

3. 涨价 (update_one)

猫粮太贵了,老板要求把名叫“喵喵”的宠物价格,修改为 1000
提示:别忘了用 `$set`,否则数据会丢失!

实践倒计时 15 分钟,现在开始!完成后请举手示意老师检查代码运行结果!

实践课圆满结束!

今天你不仅学会了 PyMongo,还独立完成了一个数据库小脚本!
下课别忘了保存你的 Python 代码哦!

代码有 Bug? 环境连不上?

遇到问题的同学请留在座位上,老师马上来帮你排错!