很多同学在学 Python 的过程中,到了“操作数据库”这一步就开始头疼:MySQL 要写 SQL,Oracle 要配驱动,Redis 又要学一套新命令。其实,如果你想用最少的代码把数据存起来、查出来、改一改、删一删,MongoDB 是一个非常友好的选择,尤其是配合 Python 的 pymongo 库,很多操作就像在操作字典一样自然。
本文会从 MongoDB 是什么讲起,逐个拆解 pymongo 的核心操作,包含完整的 Python 代码示例和运行结果说明。无论你是刚开始学 Python 的初学者,还是已经在项目里用 MongoDB 做数据存储的开发者,都能从这份教程里找到可以直接复用的内容。
1. MongoDB 是什么,为什么要用 pymongo
1.1 MongoDB 解决什么问题
MongoDB 是一个 NoSQL 文档型数据库,它不要求你提前设计表结构,也不要求每一条数据都有完全相同的字段。它存储的基本单位是“文档”,这个文档的格式非常接近 Python 里的 dict 或 JSON。比如:
{
"name": "张三",
"age": 25,
"city": "北京",
"tags": ["python", "mongodb"]
}
这种设计带来的直观好处是:业务模型变化时,不需要像关系型数据库那样频繁执行 ALTER TABLE。今天想给用户加一个 phone 字段,直接插入新数据就行,历史数据不受影响。
1.2 pymongo 是什么
pymongo 是 MongoDB 官方提供的 Python 驱动库,它把 Python 对象和 MongoDB 文档做了自然映射。你在 Python 里写的 {'name': '张三'} 可以直接插入数据库;从数据库查询出来的文档,也可以直接当成字典来操作。
1.3 MongoDB 与 MySQL 的直观对比
| 对比项 | MongoDB | MySQL |
|---|---|---|
| 数据模型 | 文档型(类似 JSON) | 关系型(表结构) |
| 表/集合 | 集合(Collection) | 表(Table) |
| 记录 | 文档(Document) | 行(Row) |
| 字段 | 字段(Field) | 列(Column) |
| 主键 | _id |
一般用自增主键 |
| 适合场景 | 快速迭代、数据结构灵活 | 强事务、复杂查询、报表统计 |
1.4 适合用 MongoDB 的场景
- 爬虫抓取的数据存储,字段不稳定时非常省心。
- 用户画像、消息记录、日志数据等半结构化数据。
- 产品原型阶段,需求变化快,不想频繁维护数据库表结构。
- 需要水平扩展的读写场景。
2. 环境准备与版本说明
2.1 安装 MongoDB 服务
要操作 MongoDB,首先需要一个 MongoDB 服务实例。你可以选择:
- 本地安装 MongoDB Community Server。
- 使用云厂商提供的 MongoDB 服务。
- 使用 Docker 启动一个临时 MongoDB 容器。
安装时版本不需要写死,以当前官方稳定版为准。本文的示例并不过度依赖某一个特定版本,重点在于演示 pymongo 的操作方式。
Windows 下安装完成后,一般可以作为 Windows 服务自动启动。Linux 下安装完成后,可以用 systemctl 或直接运行 mongod 命令启动。
2.2 启动 MongoDB 服务
本地开发时,最简单的验证方式是打开命令行执行:
mongod --dbpath D:\mongodb-data
如果看到类似 Waiting for connections 的日志,说明服务已经启动成功。
2.3 安装 pymongo
建议在虚拟环境中安装。在项目目录下执行:
pip install pymongo
如果你需要更方便地处理 MongoDB 的 BSON 数据,可以一起安装:
pip install pymongo dnspython
dnspython 主要用于 MongoDB Atlas 等连接串中包含主机名解析的场景,本地连接不强制需要。
安装完成后,可以写一个小脚本验证版本:
import pymongo
print(pymongo.__version__)
2.4 本篇使用环境
本文的代码基于 Python 3.x,pymongo 4.x 版本。不同大版本的 API 有细微差异,但最常用的插入、查询、更新、删除方法基本是一致的。
3. 连接 MongoDB 与核心对象
3.1 MongoClient 连接数据库
pymongo 的核心连接类是 MongoClient 。它既负责建立连接,也负责后续所有数据库和集合操作。
from pymongo import MongoClient
# 方式 1:裸参数
client = MongoClient("mongodb://localhost:27017/")
# 方式 2:指定主机和端口
client = MongoClient(host="localhost", port=27017)
390




被折叠的 条评论
为什么被折叠?



