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

使用PyMongo操作MongoDB(二)

四、文档操作详解

1. 插入文档

# 插入单条文档
student_data = {
    "name": "张三",
    "age": 20,
    "gender": "男",
    "courses": ["数学", "英语"]
}
result = students.insert_one(student_data)
print(f"插入的文档ID:{result.inserted_id}")

# 批量插入文档
students.insert_many([
    {"name": "李四", "age": 22, "gender": "女"},
    {"name": "王五", "age": 21, "gender": "男"}
])

2. 查询文档

基础查询
# 查询所有文档
for doc in students.find():
    print(doc)

# 查询单个文档
print(students.find_one({"name": "张三"}))
字段投影
# 仅返回name和age字段(_id默认返回)
for doc in students.find({}, {"name": 1, "age": 1}):
    print(doc)

# 排除_id字段
for doc in students.find({}, {"_id": 0, "name": 1}):
    print(doc)
条件查询
  • 比较运算符

    # 年龄大于20的学生
    students.find({"age": {"$gt": 20}})
    
    # 年龄在20-22之间的学生
    students.find({
        "age": {
            "$gte": 20,
            "$lte": 22
        }
    })
    
  • 逻辑运算符

    # 年龄大于20且性别为男
    students.find({
        "age": {"$gt": 20},
        "gender": "男"
    })
    
    # 年龄小于18或性别为女
    students.find({
        "$or": [
            {"age": {"$lt": 18}},
            {"gender": "女"}
        ]
    })
    
  • 正则匹配

    # 查询姓名以"张"开头的学生
    students.find({"name": {"$regex": "^张"}})
    
    # 不区分大小写查询
    students.find({"name": {"$regex": "li", "$options": "i"}})
    

3. 更新文档

# 更新单个文档(设置新字段)
students.update_one(
    {"name": "张三"},
    {"$set": {"major": "计算机科学"}}
)

# 批量更新(年龄加1)
students.update_many(
    {"gender": "男"},
    {"$inc": {"age": 1}}
)

# 替换整个文档
students.replace_one(
    {"name": "李四"},
    {"name": "李四", "age": 23, "gender": "女", "major": "电子信息"}
)

4. 删除文档

# 删除单个匹配文档
students.delete_one({"name": "王五"})

# 删除所有匹配文档
students.delete_many({"age": {"$lt": 18}})

五、高级操作技巧

  1. 排序与分页

    # 按年龄降序排列,跳过前2条,取3条
    students.find().sort("age", -1).skip(2).limit(3)
    
  2. 聚合管道

    from bson import Decimal128
    
    pipeline = [
        {"$match": {"gender": "男"}},
        {"$group": {"_id": "$major", "avg_age": {"$avg": "$age"}}},
        {"$sort": {"avg_age": -1}}
    ]
    for doc in students.aggregate(pipeline):
        print(doc)
    
  3. 索引管理

    # 创建单字段索引
    students.create_index("name")
    
    # 创建复合索引
    students.create_index([("age", 1), ("gender", -1)])
    
    # 查看索引
    print(students.index_information())
    

六、注意事项

  1. 连接安全:生产环境建议使用SSL加密连接
  2. 错误处理:使用try-except捕获ConnectionFailure等异常
  3. 性能优化:合理使用索引,避免全集合扫描
  4. 数据备份:定期使用mongodump进行数据备份

通过本文的详细讲解,开发者可以快速掌握PyMongo的核心操作。实际开发中应根据具体业务需求,结合MongoDB的丰富特性(如地理空间索引、事务支持等)进行深度开发。建议参考官方文档获取最新API说明和最佳实践。

http://www.dtcms.com/a/75473.html

相关文章:

  • 传奇怪物素材 8方向高清怪物 PNG格式 游戏怪物 14组
  • Android Fresco 框架工具与测试模块源码深度剖析(五)
  • 超图神经网络的详细解析与python示例
  • Spring Cloud Gateway 使用ribbon以及nacos实现灰度发布
  • leetcode日记(105)买卖股票的最佳时机Ⅱ
  • 蓝桥杯---哈希表第二题(leetcode是否为字符重新排列)
  • Linux:用 runc 构建 ARM 平台容器
  • 电动车出入库管理软件,电动车维修保养售后服务管理系统,佳易王电动车店管理系统操作教程
  • SQLMesh 系列教程:Airbnb数据分析项目实战
  • 一、初始 Linux
  • 【网络】手动部署并测试内网穿透
  • 网络华为HCIA+HCIP 以太网链路聚合与交换机堆叠、集群
  • 【Python】Python与算法有应用关系吗?
  • 施耐德PLC仿真软件Modbus tcp通讯测试
  • 离散概率分布:正态分布,二项分布,连续分布,正态分布的性质
  • Python实现自动提取目标文档的大纲(13)
  • 《驾驭MXNet:深度剖析分布式深度学习训练的高效之道》
  • Python学习- 数据结构类型
  • Folder Icons for Mac v2.0.3 文件/文件夹图标美化 支持M、Intel芯片
  • DeepSeek + Kimi 自动生成 PPT
  • 数据结构之双向链表
  • 【实战指南】基于DevExpress轻量化主题实现WPF应用性能升级
  • React类的生命周期
  • Ajax入门
  • C#进阶-ASP.NET网站会话固定漏洞的解决
  • 在云平台上用Claude 3.7 AI代理自动化电脑图形界面点击操作做表格
  • 05 MP4解码AAC + 格式知识
  • Python刷题:流程控制(上)
  • 【Kubernetes】Kube Proxy 如何帮助 Pod 之间通信?Kube-Proxy 实践案例
  • 我爱学算法之——滑动窗口攻克子数组和子串难题(上)