PyMongo 入门教程:Python 操作 MongoDB 完全指南
前言
MongoDB 是一个流行的 NoSQL 数据库,而 PyMongo 是 MongoDB 官方提供的 Python 驱动程序。本教程将带你从零开始学习如何使用 PyMongo 进行 MongoDB 数据库操作,包括连接数据库、插入文档、查询数据等核心功能。
环境准备
在开始之前,请确保你已经:
- 安装了 Python(推荐 3.6+ 版本)
- 通过 pip 安装了 PyMongo 包:
pip install pymongo
- 安装并运行了 MongoDB 服务(默认端口 27017)
验证安装是否成功:
import pymongo # 如果没有报错说明安装成功
连接 MongoDB
使用 PyMongo 的第一步是建立与 MongoDB 的连接:
from pymongo import MongoClient
# 最简单的连接方式(使用默认主机和端口)
client = MongoClient()
# 也可以显式指定主机和端口
client = MongoClient('localhost', 27017)
# 或者使用 MongoDB URI 格式
client = MongoClient('mongodb://localhost:27017/')
数据库操作
MongoDB 的一个实例可以包含多个数据库。在 PyMongo 中访问数据库有两种方式:
# 属性式访问(适用于名称符合 Python 变量命名规则的数据库)
db = client.test_database
# 字典式访问(适用于所有数据库名称)
db = client['test-database']
注意:MongoDB 的数据库和集合是"惰性创建"的,只有在第一次插入数据时才会真正创建。
集合操作
集合(Collection)相当于关系型数据库中的表,用于存储文档:
# 属性式访问集合
collection = db.test_collection
# 字典式访问集合
collection = db['test-collection']
文档操作
MongoDB 使用 JSON 风格的文档存储数据,在 Python 中我们用字典来表示:
import datetime
post = {
"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.now(tz=datetime.timezone.utc)
}
PyMongo 会自动将 Python 类型(如 datetime)转换为 BSON 类型存储。
插入文档
# 插入单个文档
post_id = db.posts.insert_one(post).inserted_id
print(post_id) # 输出类似 ObjectId('...')
每个文档都会自动获得一个唯一的 _id
字段,如果文档没有提供则会自动生成。
批量插入
new_posts = [
{
"author": "Mike",
"text": "Another post!",
"tags": ["bulk", "insert"],
"date": datetime.datetime(2009, 11, 12, 11, 14)
},
{
"author": "Eliot",
"title": "MongoDB is fun",
"text": "and pretty easy too!",
"date": datetime.datetime(2009, 11, 10, 10, 45)
}
]
result = db.posts.insert_many(new_posts)
print(result.inserted_ids) # 输出两个 ObjectId
注意第二个文档的结构与其他不同,这展示了 MongoDB 的无模式特性。
查询文档
查询单个文档
import pprint
# 查询集合中的第一个文档
pprint.pprint(db.posts.find_one())
# 带条件查询
pprint.pprint(db.posts.find_one({"author": "Mike"}))
查询多个文档
# 查询所有文档
for post in db.posts.find():
pprint.pprint(post)
# 带条件查询多个文档
for post in db.posts.find({"author": "Mike"}):
pprint.pprint(post)
按 ObjectId 查询
# 假设我们已经有一个 post_id
post = db.posts.find_one({"_id": post_id})
# 注意:不能直接使用字符串形式的 ObjectId 查询
from bson.objectid import ObjectId
post_id_str = str(post_id)
post = db.posts.find_one({"_id": ObjectId(post_id_str)}) # 正确方式
高级查询
计数
# 统计集合中所有文档数量
db.posts.count_documents({})
# 统计满足条件的文档数量
db.posts.count_documents({"author": "Mike"})
范围查询
# 查询日期早于指定时间的文档,并按作者排序
d = datetime.datetime(2009, 11, 12, 12)
for post in db.posts.find({"date": {"$lt": d}}).sort("author"):
pprint.pprint(post)
这里使用了 $lt
操作符表示"小于"。
索引操作
索引可以显著提高查询性能,还可以强制某些约束:
# 创建唯一索引
result = db.profiles.create_index([("user_id", pymongo.ASCENDING)], unique=True)
# 查看索引信息
print(sorted(list(db.profiles.index_information())))
尝试插入重复数据会抛出异常:
user_profiles = [
{"user_id": 211, "name": "Luke"},
{"user_id": 212, "name": "Ziltoid"}
]
db.profiles.insert_many(user_profiles)
# 这会抛出 DuplicateKeyError 异常
duplicate_profile = {"user_id": 212, "name": "Tommy"}
db.profiles.insert_one(duplicate_profile)
总结
本教程涵盖了 PyMongo 的基本操作,包括:
- 连接 MongoDB
- 数据库和集合操作
- 文档的插入(单条和批量)
- 各种查询方式
- 索引创建和使用
掌握了这些基础知识后,你已经可以开始使用 Python 操作 MongoDB 数据库了。PyMongo 还提供了更多高级功能,如聚合管道、事务处理等,可以在掌握基础后进一步学习。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考