【python】在Python中操作MongoDB的详细用法教程与实战案例分享

news2024/9/21 8:01:13

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • 在Python中操作MongoDB
    • 1. 环境准备
      • 1.1 安装MongoDB
      • 1.2 安装PyMongo
    • 2. 连接MongoDB
    • 3. 插入数据
      • 3.1 插入单条数据
      • 3.2 插入多条数据
    • 4. 查询数据
      • 4.1 查询所有文档
      • 4.2 查询单个文档
      • 4.3 带条件查询
      • 4.4 模糊查询
    • 5. 更新数据
      • 5.1 更新单个文档
      • 5.2 更新多个文档
    • 6. 删除数据
      • 6.1 删除单个文档
      • 6.2 删除多个文档
    • 7. 索引
    • 8. 聚合管道
    • 9. 事务
    • 10. 实用技巧和最佳实践
      • 10.1 使用连接池
      • 10.2 监控和日志
      • 10.3 使用游标超时
      • 10.4 安全性
      • 10.5 性能和优化
      • 10.6 使用GridFS存储大文件
      • 10.7 异步操作
      • 10.8 备份和恢复
      • 10.9 学习和社区
    • 总结

在Python中操作MongoDB

MongoDB是一个高性能、开源、无模式的文档型数据库,非常适合存储JSON风格的数据。Python作为一种广泛使用的编程语言,通过PyMongo库可以方便地与MongoDB进行交互。本文将详细介绍如何在Python中使用PyMongo库来操作MongoDB数据库,包括连接数据库、创建数据库和集合、插入数据、查询数据、更新数据和删除数据等基本操作。

1. 环境准备

1.1 安装MongoDB

首先,你需要在你的机器上安装MongoDB。这里以Docker方式安装MongoDB为例,因为Docker可以方便地管理数据库环境。

  1. 拉取MongoDB镜像

    docker pull mongo:6.0.2
    
  2. 创建并运行MongoDB容器

    docker run --name mongo -d -p 27017:27017 mongo:6.0.2
    

    这条命令会创建一个名为mongo的容器,并映射容器的27017端口到宿主机的27017端口。

1.2 安装PyMongo

在Python中操作MongoDB,你需要安装PyMongo库。可以通过pip安装:

pip install pymongo

2. 连接MongoDB

在Python中,你可以使用pymongo.MongoClient来连接MongoDB数据库。以下是一个基本的连接示例:

from pymongo import MongoClient

# 连接到MongoDB
client = MongoClient('localhost', 27017)

# 选择或创建数据库
db = client['mydatabase']

# 选择或创建集合
collection = db['mycollection']

注意:在MongoDB中,数据库和集合在第一次使用时会自动创建,无需显式创建。

3. 插入数据

3.1 插入单条数据

你可以使用insert_one()方法向集合中插入单条数据。

# 插入单条数据
doc = {"name": "John", "age": 30, "city": "New York"}
result = collection.insert_one(doc)

# 打印插入的文档的ID
print(result.inserted_id)

3.2 插入多条数据

使用insert_many()方法可以一次性插入多条数据。

# 插入多条数据
docs = [
    {"name": "Amy", "age": 25, "city": "Los Angeles"},
    {"name": "Hannah", "age": 22, "city": "Chicago"},
    {"name": "Michael", "age": 27, "city": "Boston"}
]
result = collection.insert_many(docs)

# 打印插入的文档的ID列表
print(result.inserted_ids)

4. 查询数据

4.1 查询所有文档

使用find()方法可以查询集合中的所有文档。

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

4.2 查询单个文档

使用find_one()方法可以查询并返回集合中的第一个匹配文档。

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

4.3 带条件查询

你可以通过传递查询条件来过滤返回的文档。

# 带条件查询
docs = collection.find({"age": {"$gt": 25}})
for doc in docs:
    print(doc)

4.4 模糊查询

MongoDB支持正则表达式进行模糊查询。

# 模糊查询
import re
docs = collection.find({"name": re.compile("^J")})
for doc in docs:
    print(doc)

或者使用MongoDB的$regex操作符:

# 使用$regex进行模糊查询
docs = collection.find({"name": {"$regex": "^J"}})
for doc in docs:
    print(doc)

5. 更新数据

5.1 更新单个文档

使用update_one()方法可以更新集合中第一个匹配的文档。

# 更新单个文档
query = {"name": "John"}
newvalues = {"$set": {"age": 31}}
result = collection.update_one(query, newvalues)

# 打印匹配和修改的文档数量
print(result.matched_count, result.modified_count)

5.2 更新多个文档

如果你想要更新所有匹配的文档,可以使用update_many()方法。

# 更新多个文档
query = {"age": {"$gt": 25}}
newvalues = {"$set": {"status": "senior"}}
result = collection.update_many(query, newvalues)

# 打印匹配和修改的文档数量
print(result.matched_count, result.modified_count)

6. 删除数据

6.1 删除单个文档

使用delete_one()方法可以删除集合中第一个匹配的文档。

# 删除单个文档
query = {"name": "Amy"}
result = collection.delete_one(query)

# 打印删除的文档数量
print(result.deleted_count)

6.2 删除多个文档

如果你想要删除所有匹配的文档,可以使用delete_many()方法。

# 删除多个文档
query = {"status": "senior"}
result = collection.delete_many(query)

# 打印删除的文档数量
print(result.deleted_count)

7. 索引

MongoDB支持索引来提高查询性能。你可以为集合中的字段创建索引。

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

# 也可以为多个字段创建复合索引
collection.create_index([("name", pymongo.ASCENDING), ("age", pymongo.DESCENDING)])

8. 聚合管道

MongoDB的聚合管道是一种强大的数据处理工具,可以对集合中的文档进行复杂的数据处理。

# 使用聚合管道
pipeline = [
    {"$match": {"age": {"$gt": 25}}},
    {"$group": {"_id": "$city", "count": {"$sum": 1}}}
]

results = collection.aggregate(pipeline)

for result in results:
    print(result)

这个示例中,我们首先通过$match阶段筛选出年龄大于25的文档,然后通过$group阶段按城市分组,并计算每个城市的文档数量。

9. 事务

从MongoDB 4.0开始,支持多文档事务。这允许你在多个集合和数据库上执行一系列操作,同时保持数据的一致性和完整性。

from pymongo import MongoClient

# 连接到MongoDB
client = MongoClient('localhost', 27017)

# 确保MongoDB在副本集模式下运行(事务需要副本集)
db = client['mydatabase']

# 开始一个会话
with client.start_session() as session:
    with session.start_transaction():
        # 在此执行事务操作
        collection1.insert_one(doc1, session=session)
        collection2.insert_one(doc2, session=session)

# 注意:事务需要在副本集或分片集群上运行

10. 实用技巧和最佳实践

10.1 使用连接池

在Web应用程序中,频繁地创建和销毁MongoDB连接是不高效的。建议使用连接池来重用连接。

from pymongo import MongoClient

# 创建一个连接池
client = MongoClient('localhost', 27017, maxPoolSize=100)

# 使用client进行数据库操作
db = client['mydatabase']
collection = db['mycollection']

# 操作完成后,连接会自动返回到连接池中

10.2 监控和日志

对于生产环境,监控MongoDB的性能和日志是非常重要的。确保启用MongoDB的日志记录,并使用适当的工具来监控数据库的性能。

10.3 使用游标超时

当使用大量数据时,游标可能会占用大量资源。使用游标时,可以设置超时时间以避免潜在的资源泄露。

# 设置游标超时时间
cursor = collection.find().batch_size(10).add_option(pymongo.cursor.NoCursorTimeout)

注意:通常不推荐在生产环境中使用NoCursorTimeout,因为它可能导致游标无限期地保持打开状态。

10.4 安全性

确保MongoDB实例受到适当的保护,包括网络层面的访问控制、身份验证和授权。

10.5 性能和优化

  • 索引优化:确保为查询中常用的字段创建索引,但也要避免过多索引,因为索引会占用额外的磁盘空间并可能影响写操作的性能。
  • 查询优化:优化查询语句,减少不必要的数据检索,使用覆盖索引来减少磁盘I/O。
  • 批量操作:在可能的情况下使用批量插入、更新和删除操作来提高性能。
  • 监控和调优:定期监控MongoDB的性能指标,如查询响应时间、索引命中率、内存使用等,并根据需要进行调优。

10.6 使用GridFS存储大文件

MongoDB的GridFS是一个用于存储和检索大文件的规范。它可以将大文件分割成多个较小的块,并将这些块存储在MongoDB的集合中。GridFS提供了与MongoDB API类似的接口来操作文件。

from pymongo import MongoClient
from gridfs import GridFS

# 连接到MongoDB
client = MongoClient('localhost', 27017)
db = client['mydatabase']

# 创建GridFS实例
fs = GridFS(db)

# 上传文件
with open('large_file.dat', 'rb') as f:
    file_id = fs.put(f, filename='large_file.dat')

# 下载文件
with fs.get(file_id) as f:
    with open('downloaded_large_file.dat', 'wb') as out:
        out.write(f.read())

10.7 异步操作

虽然PyMongo本身不提供直接的异步API,但你可以使用如motor这样的库来与MongoDB进行异步交互。motor是PyMongo的一个异步版本,它基于Python的asyncio库。

import asyncio
from motor.motor_asyncio import AsyncIOMongoClient

async def main():
    client = AsyncIOMongoClient('localhost', 27017)
    db = client['mydatabase']
    collection = db['mycollection']

    # 异步插入文档
    await collection.insert_one({"name": "John Doe", "age": 30})

    # 异步查询
    async for doc in collection.find({"age": 30}):
        print(doc)

    # 关闭连接
    await client.close()

# 运行异步主函数
asyncio.run(main())

10.8 备份和恢复

定期备份MongoDB数据库是非常重要的,以防数据丢失或损坏。MongoDB提供了多种备份和恢复的方法,包括使用mongodumpmongorestore命令行工具,以及第三方备份解决方案。

10.9 学习和社区

MongoDB和PyMongo的官方文档是学习这些工具的最佳资源。此外,参与MongoDB的社区论坛、Stack Overflow等社区,也是获取帮助和分享经验的好地方。

总结

通过本教程,你不仅学会了如何在Python中使用PyMongo库来操作MongoDB数据库,还了解了如何优化查询、处理大文件、进行异步操作以及进行备份和恢复。MongoDB是一个功能强大的NoSQL数据库,PyMongo则为Python开发者提供了一个易于使用的接口来与之交互。希望这些知识和技巧能帮助你在项目中更有效地使用MongoDB。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2034838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《黑神话:悟空 性能测试工具》Steam已免费开放下载

《黑神话:悟空》将于8月20日上午10点正式解锁,届时大家就能体验到这款期待三年的国产3A之光了。为了方便大家游玩,官方提前上线了性能测试工具,目前《黑神话:悟空 性能测试工具》已在Steam商店开放免费下载。 据Steam评…

Qt | QSQLite内存数据库增删改查

点击上方"蓝字"关注我们 01、演示 参数随便设置 查询 修改 右键菜单是重点 手动提交,点击Submit All

2024下半年软考报考攻略:从报名到拿证全流程,看这一篇就够了!

下半年软考本月就要开启报名了,有一些同学可能是第一次参加,还不清楚具体流程。今天小编就来为大家总结软考从报名到拿证的全过程指南,有需要的可以收藏这篇攻略哦! 一、报名流程 1、登录网站 登录中国计算机技术职业资格网&…

C++结构体指针强制转换以处理电力系统IEC103报文

前言 最近依旧是开发规约解析工具的103篇,已经完成了通用分类服务部分的解析,现在着手开始搞扰动数据传输,也就是故障录波的传输。 在103故障录波(扰动数据)的报文中,数据是一个数据集一个数据集地存放&a…

如何有效优化无线双模蓝牙模块的通讯距离?

许多客户在使用无线双模蓝牙模块时发现传输距离达不到预期要求。影响无线蓝牙模块通讯距离的因素有很多,以下是美迅物联网MesoonRF归纳总结的一些可能的原因以及如何改善: 1.优化天线设计 天线是影响无线双模蓝牙模块通讯距离的关键因素之一,…

IPC进程间通信

信号 信号是一种终端机制,程序运行到一半的时候接收到了某种通知,程序就会立刻中断运行,转而去处理通知。 登记信号 一个进程只会接收默认的几个信号 如果想要让一个进程接收特定信号的话,必须提前在该进程中登记一下想要接收…

一次了解所有功能!超详细【Stable Diffusion界面】大揭秘!

对于AI绘画的初学者而言,一看到SD的UI界面肯定是一脸懵,因为有太多陌生词汇,什么大模型、什么提示词、什么什么采样迭代,和传统的画图方式完全不在一个层面上,学习起来就无从下手~ 今天小元老师就给大家详…

运维高级内容--lvs按权重值轮询调度

创建5台主机(一些配置是基于实验一的基础): 客户端client 172.25.254.200路由器route 172.25.254.100 192.168.0.100 (需要eth0、eth1两个网关)LVS 192.168.0.50webserver1 192.168.0.10webserver2 192.168.0.20 1.LVS主机: vim…

DataGrip安装与MySQL连接

DataGrip安装 官网:DataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains 点击页面中的【Download】进入下载界面,如下图所示: 根据自己的电脑系统选择不同的版本【windows/macOS/linux】,点击【.exe】可选择…

MySQL(一)——初识数据库(概念、数据类型、基本表库操作)

文章目录 初识数据库数据库相关基本概念数据库的分类 MySQL数据库数据模型基本操作库操作查看数据库创建数据库删除数据库选中数据库 数据类型数值类型字符串类型日期类型 表操作查看所有表查看表结构创建表删除表 其他操作查看警告信息查看编码集 这是我们 MySQL 学习的第一程…

GD32E503实现串口中断收发功能

如有技术问题及技术需求请加作者微信! 源码下载链接:代码下载 亲测可用实现GD32E503库函数串口数据收发功能: #include "gd32e50x.h" #include "gd32e503v_eval.h" #include "systick.h" #include <stdio.h> #include "user_uart…

JVM知识总结(性能调优)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 性能调优 何时进行JVM调优&#xff1f; 遇到以下情况&#xff0c…

初识C++ · 智能指针

目录 前言&#xff1a; 1 智能指针的发展历史 2 unique_ptr和shared_ptr的基本使用 3 shared_ptr的模拟实现 4 有关定制删除器 前言&#xff1a; 智能指针的引入&#xff0c;我们得先从异常开始说起&#xff0c;异常面临的一个窘境是new了多个对象&#xff0c;抛异常了会…

centos7简介和安装步骤

目录 centos简介 1.CentOS 7 简略简介 2.使用建议 vmware搭建centos7 1.centos镜像下载 2.虚拟机创建 2.1 新建虚拟机 2.2典型 2.3操作系统 2.4客户机操作系统选择 ​编辑 2.5虚拟机命名与位置安装 2.5磁盘容量 2.6完成 2.6编辑虚拟机 2.6.1内存大小编辑 2.6.…

React+vite+antd点击路由切换时出现闪屏

问题描述:点击左侧路由切换会出现闪屏的情况 页面的效果 解决方案 完整代码 import { lazy, Suspense, ReactNode } from "react"; import { Navigate, useLocation } from "react-router-dom"; import LayOut from ../pages/LayOut/LayOut import NotFo…

过滤了字母、数字、_、$的webshell命令执行技巧

目录 对于php5以上首先要解决的问题有 解决技巧 1.code长度小于35位 2.没有字母、数字、_ 、$ 3.怎么把文件放进服务器 4.怎么执行文件里面的内容 1.执行Linux命令 2.执行文件里面的shell命令 5.构造完整的code参数 6.我们还可以通过修改文件里面shell命令&#xff0c;…

学习记录703@计算机组成原理之原码、补码、反码、移码

数据表示基本概念 数据表示分为有符号数和无符号数&#xff0c;其中有符号数分为整数、纯小数、带小数&#xff1b;整数和纯小数小数点位置固定&#xff0c;统称为定点数&#xff1b;带小数小数点位置可以浮动&#xff0c;称为为浮点数&#xff0c;浮点数阶码就是整数部分&…

忘记iPhone锁屏密码,多次输出密码导致iPhone停用了怎么解锁?

iphone已停用怎么解锁&#xff1f;当因忘记iPhone锁屏密码&#xff0c;多次输入错误密码而被停用时&#xff0c;怎么解锁恢复对设备的访问是非常重要的。下面小编将给大家介绍几种解锁已停用iPhone的方法&#xff0c;一起来看看吧&#xff01; 一、使用恢复模式解锁 将iPhone连…

知识学习技巧:如何从 iPhone 恢复误操作删除的视频

您来这里主要是因为您想知道如何从 iPhone 恢复已删除的视频。实际上&#xff0c;如果视频是用 iPhone 拍摄的&#xff0c;您可以尝试在相册“最近删除”中找到它们。删除后它将保留 40 天。如果您清空了相册或无法从相册中找到已删除的视频&#xff0c;那么您必须尝试使用奇客…

系统管理篇

系统管理 一、网络管理1. 网络状态查看2. 网络和路由配置3. 网络故障排除4. 网络服务管理 二、软件管理1. 软件包管理器2. rpm包和rpm命令3. yum仓库4. 源代码编译安装5. 内核升级6. grub配置文件 三、进程管理1. 进程的概念与进程查看2. 进程的控制命令3. 进程的通信方式--信号…