Python MongoDB知识点汇总
编程小白的通俗易懂指南
📚 MongoDB基础概念
什么是MongoDB?
MongoDB是一个非关系型数据库(NoSQL),与传统的关系型数据库(如MySQL)不同,它以类似JSON的格式存储数据,非常灵活。
核心概念类比
📁 数据库(Database)
像一个文件柜,里面可以放多个文件夹(集合)
🗂️ 集合(Collection)
像文件夹,里面存放具体的文件(文档)
📄 文档(Document)
像文件,是实际存储数据的地方,使用类似JSON的格式(BSON)
🔑 为什么使用MongoDB?
- 数据结构灵活,不需要预先定义表结构
- 适合存储半结构化或非结构化数据
- 水平扩展容易,适合大数据量场景
- 与Python配合良好,特别适合Web开发
🐍 Python连接MongoDB
安装PyMongo
PyMongo是Python操作MongoDB的官方驱动库
pip install pymongo
建立连接
from pymongo import MongoClient # 连接到本地MongoDB服务 client = MongoClient('mongodb://localhost:27017/') # 连接到数据库(不存在则创建) db = client['mydatabase'] # 连接到集合(不存在则创建) collection = db['mycollection']
连接远程数据库
# 带用户名密码的连接 client = MongoClient('mongodb://username:password@host:27017/')
💡 注意事项
- 27017是MongoDB的默认端口
- 数据库和集合在第一次插入数据时才会真正创建
- 生产环境一定要使用用户名密码认证
➕ 数据操作(CRUD)
插入数据
# 插入单个文档 student = {"name": "张三", "age": 20, "major": "计算机科学"} result = collection.insert_one(student) print("插入ID:", result.inserted_id) # 插入多个文档 students = [ {"name": "李四", "age": 22, "major": "数学"}, {"name": "王五", "age": 21, "major": "物理"} ] result = collection.insert_many(students) print("插入IDs:", result.inserted_ids)
查询数据
# 查询单个文档 result = collection.find_one({"name": "张三"}) print(result) # 查询所有文档 for student in collection.find(): print(student) # 条件查询(年龄大于20) for student in collection.find({"age": {"$gt": 20}}): print(student)
更新数据
# 更新单个文档 collection.update_one( {"name": "张三"}, {"$set": {"age": 21}} ) # 更新多个文档(所有数学专业年龄+1) collection.update_many( {"major": "数学"}, {"$inc": {"age": 1}} )
删除数据
# 删除单个文档 collection.delete_one({"name": "张三"}) # 删除多个文档 collection.delete_many({"major": "数学"})
🔍 高级查询技巧
查询运算符
$gt
:大于(great than)$lt
:小于(less than)$ne
:不等于(not equal)$in
:在数组中$regex
:正则表达式匹配
# 年龄在20到25之间的学生 collection.find({"age": {"$gte": 20, "$lte": 25}})
投影(选择返回字段)
# 只返回name和age字段,不返回_id for student in collection.find({}, {"_id": 0, "name": 1, "age": 1}): print(student)
排序与限制
# 按年龄降序排序,取前5个 for student in collection.find().sort("age", -1).limit(5): print(student)
聚合管道
用于复杂的数据处理和分组操作
# 按专业分组统计平均年龄 pipeline = [ {"$group": {"_id": "$major", "avg_age": {"$avg": "$age"}}} ] results = collection.aggregate(pipeline) for res in results: print(res)
⚙️ 索引与管理
为什么需要索引?
索引就像书的目录,可以大大加快查询速度,特别是数据量大的时候。
创建索引
# 单字段索引 collection.create_index("name") # 复合索引 collection.create_index([("major", 1), ("age", -1)]) # 唯一索引(防止重复) collection.create_index("email", unique=True)
数据库管理
# 列出所有数据库 print(client.list_database_names()) # 列出所有集合 print(db.list_collection_names()) # 删除集合 db.drop_collection("mycollection") # 删除数据库 client.drop_database("mydatabase")
💡 实用建议
- 为经常查询的字段创建索引
- 避免返回大结果集(使用limit)
- 定期备份重要数据
- 生产环境使用副本集保证高可用
✅ 最佳实践
文档设计原则
- 将经常一起访问的数据放在同一文档中
- 避免创建巨大的文档(超过16MB)
- 避免深度嵌套(嵌套层级不宜过深)
- 使用有意义的字段名(但不要过长)
安全注意事项
- 永远不要在生产环境使用无密码的MongoDB
- 使用角色访问控制(RBAC)
- 启用网络加密(TLS/SSL)
- 定期更新MongoDB版本
常见错误
- 忘记关闭数据库连接(使用with语句可自动关闭)
- 混淆insert_one和insert_many
- 忘记处理重复键错误(唯一索引)
- 在循环中执行大量数据库操作(性能差)
📈 学习路径建议
- 掌握基本CRUD操作
- 学习查询运算符和投影
- 练习索引创建与管理
- 学习聚合管道
- 了解安全配置