Python3入门指南Python语言的特点和实际应用Python3环境搭建配置VSCode进行Python开发Python基础语法Python变量与数据类型Python数据类型转换Python解释器使用Python注释使用Python运算符Python数字类型Python字符串操作Python列表操作Python元组使用Python字典使用Python集合使用Python条件控制详解Python循环语句详解Python编程入门实践Python推导式详解Python迭代器和生成器Python with语句详解Python函数详解Python lambda(匿名函数)Python装饰器Python数据结构Python模块和包使用Python中__name__和__main__的用法Python输入输出:从基础到文件操作Python文件操作Python OS模块使用Python错误和异常处理Python面向对象编程Python命名空间和作用域Python虚拟环境:venv详细教程Python类型注解Python标准库常用模块Python正则表达式Python CGI编程Python MySQL(mysql-connector驱动)Python MySQL(PyMySQL驱动)Python网络编程Python发送邮件Python多线程编程Python XML解析Python JSON解析Python日期和时间处理Python操作MongoDBPython urllib库使用Python uWSGI 安装与配置Python pip包管理工具Python operator模块Python math模块Python requests模块HTTP请求Python random模块Python OpenAI库Python AI绘画制作Python statistics模块Python hashlib模块:哈希加密Python量化交易Python pyecharts数据可视化Python Selenium网页自动化Python BeautifulSoup网页数据提取Python Scrapy爬虫框架Python Markdown转HTMLPython sys模块Python Pickle模块:数据存储Python subprocess模块Python queue队列模块Python StringIO内存文件操作Python logging日志记录Python datetime日期时间处理Python re正则表达式Python csv表格数据处理Python threading 多线程编程Python asyncio 异步编程Python PyQt 图形界面开发Python 应用方向和常用库框架

Python操作MongoDB

MongoDB是一种流行的NoSQL数据库,它使用类似JSON的BSON格式存储数据。与传统的关系型数据库不同,MongoDB具有更好的灵活性和扩展性。本文将详细介绍如何使用Python连接和操作MongoDB数据库。


安装PyMongo驱动

Python需要通过MongoDB驱动来连接数据库,最常用的就是PyMongo。

使用pip安装PyMongo:

pip install pymongo

如果需要安装特定版本:

pip install pymongo==4.3.3

升级到最新版本:

pip install --upgrade pymongo

安装完成后,可以创建一个测试文件来验证安装是否成功:

import pymongo
print("PyMongo安装成功!")

如果运行没有报错,说明PyMongo已经正确安装。


连接MongoDB数据库

在开始操作之前,需要先连接到MongoDB数据库:

import pymongo

# 连接到本地MongoDB服务
client = pymongo.MongoClient("mongodb://localhost:27017/")

# 或者使用简写形式
client = pymongo.MongoClient("localhost", 27017)

如果MongoDB设置了用户名和密码,需要这样连接:

client = pymongo.MongoClient("mongodb://username:password@localhost:27017/")


创建和管理数据库

创建数据库非常简单:

# 创建或选择数据库
db = client["mydatabase"]
# 或者
db = client.mydatabase

重要说明:在MongoDB中,数据库只有在插入数据后才会真正创建。仅仅声明数据库名称是不会创建数据库的。

检查数据库是否存在:

# 获取所有数据库名称
db_list = client.list_database_names()

# 检查数据库是否存在
if "mydatabase" in db_list:
    print("数据库存在")
else:
    print("数据库不存在")


创建和管理集合

集合相当于关系型数据库中的表:

# 创建或选择集合
collection = db["mycollection"]
# 或者
collection = db.mycollection

同样,集合也只有在插入数据后才会真正创建。

检查集合是否存在:

# 获取所有集合名称
collection_list = db.list_collection_names()

if "mycollection" in collection_list:
    print("集合存在")
else:
    print("集合不存在")

插入文档

文档相当于关系型数据库中的行记录:

# 插入单个文档
document = {
    "name": "张三",
    "age": 25,
    "city": "北京",
    "hobbies": ["阅读", "游泳", "编程"]
}

result = collection.insert_one(document)
print("插入的文档ID:", result.inserted_id)

# 插入多个文档
documents = [
    {"name": "李四", "age": 30, "city": "上海"},
    {"name": "王五", "age": 28, "city": "广州"},
    {"name": "赵六", "age": 35, "city": "深圳"}
]

result = collection.insert_many(documents)
print("插入的文档IDs:", result.inserted_ids)

查询文档

查询是数据库操作中最常用的功能:

# 查询第一个文档
first_doc = collection.find_one()
print("第一个文档:", first_doc)

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

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

# 查询特定字段
print("只显示姓名和城市:")
for doc in collection.find({}, {"name": 1, "city": 1}):
    print(doc)

常用查询操作符:

  • $eq:等于

  • $gt:大于

  • $lt:小于

  • $gte:大于等于

  • $lte:小于等于

  • $in:在数组中

  • $and:与操作

  • $or:或操作

更新文档

更新现有文档:

# 更新单个文档
result = collection.update_one(
    {"name": "张三"},
    {"$set": {"age": 26, "city": "杭州"}}
)
print("修改的文档数:", result.modified_count)

# 更新多个文档
result = collection.update_many(
    {"age": {"$lt": 30}},
    {"$set": {"status": "青年"}}
)
print("修改的文档数:", result.modified_count)

# 替换整个文档
result = collection.replace_one(
    {"name": "李四"},
    {"name": "李四", "age": 31, "city": "南京", "job": "工程师"}
)

删除文档

删除不需要的文档:

# 删除单个文档
result = collection.delete_one({"name": "王五"})
print("删除的文档数:", result.deleted_count)

# 删除多个文档
result = collection.delete_many({"age": {"$gt": 30}})
print("删除的文档数:", result.deleted_count)

# 删除所有文档
result = collection.delete_many({})
print("删除的文档数:", result.deleted_count)


高级查询技巧

排序查询结果

# 按年龄升序排列
for doc in collection.find().sort("age"):
    print(doc)

# 按年龄降序排列
for doc in collection.find().sort("age", -1):
    print(doc)

限制返回结果数量

# 只返回前2个结果
for doc in collection.find().limit(2):
    print(doc)

复杂条件查询

# 多个条件组合查询
query = {
    "$and": [
        {"age": {"$gte": 25}},
        {"age": {"$lte": 35}},
        {"city": {"$in": ["北京", "上海"]}}
    ]
}

for doc in collection.find(query):
    print(doc)

索引操作

创建索引可以提高查询速度:

# 创建单字段索引
collection.create_index("name")

# 创建复合索引
collection.create_index([("name", 1), ("age", -1)])

# 获取所有索引
indexes = collection.list_indexes()
for index in indexes:
    print(index)


实际应用示例

下面是一个完整的用户管理系统示例:

import pymongo
from datetime import datetime

class UserManager:
    def __init__(self):
        self.client = pymongo.MongoClient("localhost", 27017)
        self.db = self.client["user_management"]
        self.users = self.db["users"]
        
        # 创建索引
        self.users.create_index("email", unique=True)
    
    def add_user(self, name, email, age, city):
        try:
            user_data = {
                "name": name,
                "email": email,
                "age": age,
                "city": city,
                "created_at": datetime.now()
            }
            result = self.users.insert_one(user_data)
            print(f"用户 {name} 添加成功,ID: {result.inserted_id}")
            return True
        except pymongo.errors.DuplicateKeyError:
            print("错误:邮箱已存在")
            return False
    
    def find_user_by_email(self, email):
        return self.users.find_one({"email": email})
    
    def find_users_by_city(self, city):
        return list(self.users.find({"city": city}))
    
    def update_user_age(self, email, new_age):
        result = self.users.update_one(
            {"email": email},
            {"$set": {"age": new_age, "updated_at": datetime.now()}}
        )
        return result.modified_count > 0

# 使用示例
if __name__ == "__main__":
    manager = UserManager()
    
    # 添加用户
    manager.add_user("张三", "zhangsan@email.com", 25, "北京")
    manager.add_user("李四", "lisi@email.com", 30, "上海")
    
    # 查询用户
    user = manager.find_user_by_email("zhangsan@email.com")
    print("查询结果:", user)


最佳实践建议

  1. 连接管理:在应用程序中重用数据库连接,不要频繁创建和关闭连接。

  2. 错误处理:始终对数据库操作进行错误处理:

try:
    result = collection.insert_one(document)
except pymongo.errors.DuplicateKeyError:
    print("重复键错误")
except pymongo.errors.ConnectionFailure:
    print("连接失败")
  1. 使用项目:只查询需要的字段,提高查询效率。

  2. 批量操作:大量数据操作时使用批量方法,减少网络开销。

  3. 索引优化:为经常查询的字段创建索引。


总结

通过PyMongo,Python可以很方便地操作MongoDB数据库。从基本的增删改查到高级的索引和聚合操作,PyMongo提供了完整的api支持。掌握这些技能后,你就能够构建强大的数据驱动应用程序。

对于想深入学习MongoDB的读者,建议参考fly63教程中的MongoDB高级主题,包括聚合管道、事务处理、性能优化等内容。记住,实践是最好的学习方式,多动手编写代码,逐步掌握MongoDB的各种特性。

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/course/36_2119

目录选择