当前位置:首页 > Python > 正文

Python操作MongoDB数据库完整教程 - 从入门到实践

Python操作MongoDB数据库教程

学习使用PyMongo库进行数据库连接、CRUD操作、索引管理等实用技巧

MongoDB与Python

MongoDB是一个流行的NoSQL数据库,以其灵活的文档结构和易扩展性著称。Python通过PyMongo库提供了操作MongoDB的能力。

为什么选择MongoDB?

  • 灵活的文档结构(BSON格式)
  • 强大的横向扩展能力
  • 适合处理半结构化数据
  • 丰富的查询语言

PyMongo核心功能

  • 数据库连接与认证
  • 文档CRUD操作
  • 索引管理
  • 聚合管道操作
  • GridFS文件存储

安装PyMongo

使用pip安装PyMongo库:

pip install pymongo

安装完成后,可以导入库并验证版本:

import pymongo

print(pymongo.__version__)
# 输出类似: 4.3.3

连接MongoDB数据库

连接本地MongoDB实例:

from pymongo import MongoClient

# 连接到本地MongoDB实例,默认端口27017
client = MongoClient('mongodb://localhost:27017/')

# 列出所有数据库名称
print(client.list_database_names())

连接带认证的MongoDB服务器:

# 带用户名和密码的连接
client = MongoClient(
    'mongodb://username:password@localhost:27017/'
)

# 或者使用字典形式
client = MongoClient(
    host='localhost',
    port=27017,
    username='username',
    password='password',
    authSource='admin'  # 认证数据库
)

基本CRUD操作

创建数据库和集合

# 选择或创建数据库(如果不存在会自动创建)
db = client['mydatabase']

# 选择或创建集合(类似SQL中的表)
collection = db['mycollection']

插入文档

# 插入单个文档
user = {
    "name": "John Doe",
    "email": "john@example.com",
    "age": 30,
    "interests": ["reading", "hiking", "coding"]
}
insert_result = collection.insert_one(user)
print(f"插入文档ID: {insert_result.inserted_id}")

# 插入多个文档
users = [
    {"name": "Alice", "email": "alice@example.com", "age": 25},
    {"name": "Bob", "email": "bob@example.com", "age": 35},
    {"name": "Charlie", "email": "charlie@example.com", "age": 40}
]
insert_many_result = collection.insert_many(users)
print(f"插入文档IDs: {insert_many_result.inserted_ids}")

查询文档

# 查询所有文档
print("所有用户:")
for user in collection.find():
    print(user)

# 条件查询
print("年龄大于30的用户:")
for user in collection.find({"age": {"$gt": 30}}):
    print(user)

# 查询单个文档
john = collection.find_one({"name": "John Doe"})
print("查询John Doe:", john)

更新文档

# 更新单个文档
update_result = collection.update_one(
    {"name": "John Doe"},
    {"$set": {"age": 31}}
)
print(f"匹配数量: {update_result.matched_count}, 修改数量: {update_result.modified_count}")

# 更新多个文档
update_result = collection.update_many(
    {"age": {"$lt": 30}},
    {"$inc": {"age": 1}}  # 年龄加1
)
print(f"匹配数量: {update_result.matched_count}, 修改数量: {update_result.modified_count}")

删除文档

# 删除单个文档
delete_result = collection.delete_one({"name": "Charlie"})
print(f"删除文档数量: {delete_result.deleted_count}")

# 删除多个文档
delete_result = collection.delete_many({"age": {"$gt": 40}})
print(f"删除文档数量: {delete_result.deleted_count}")

# 删除集合中所有文档(谨慎操作!)
# collection.delete_many({})

高级操作

索引管理

# 创建单字段索引
collection.create_index("email", unique=True)

# 创建复合索引
collection.create_index([("name", pymongo.ASCENDING), ("age", pymongo.DESCENDING)])

# 查看索引
indexes = collection.list_indexes()
for idx in indexes:
    print(idx)

# 删除索引
collection.drop_index("email_1")

聚合管道

# 计算不同年龄的用户数量
pipeline = [
    {"$group": {"_id": "$age", "count": {"$sum": 1}}},
    {"$sort": {"_id": 1}}
]

age_groups = collection.aggregate(pipeline)
for group in age_groups:
    print(f"年龄: {group['_id']}, 人数: {group['count']}")

最佳实践与注意事项

连接管理

使用上下文管理器确保连接关闭:

with MongoClient('mongodb://localhost:27017/') as client:
    db = client['mydatabase']
    # 执行数据库操作
# 连接自动关闭

性能优化

  • 为常用查询字段创建索引
  • 使用投影仅返回必要字段:collection.find({}, {"_id": 0, "name": 1})
  • 批量操作减少网络请求
  • 避免在应用层处理大量数据

安全注意事项

  • 不要将数据库凭据硬编码在代码中(使用环境变量)
  • 生产环境开启认证和授权
  • 使用TLS/SSL加密连接
  • 遵循最小权限原则

总结

通过本教程,您已经学习了:

  1. 安装PyMongo并连接MongoDB数据库
  2. 执行基本CRUD(创建、读取、更新、删除)操作
  3. 管理索引以提高查询性能
  4. 使用聚合管道进行复杂数据处理
  5. 遵循MongoDB最佳实践和安全建议

MongoDB和Python的结合为现代应用开发提供了强大的数据存储和处理能力。继续探索PyMongo文档以了解更多高级功能!

发表评论