Python 操作 MongoDB 教程
一、引言
在当今数字化时代,数据的存储和管理至关重要。传统的关系型数据库在处理一些复杂场景时可能会显得力不从心,而 NoSQL 数据库应运而生。MongoDB 作为一款开源的、面向文档的 NoSQL 数据库,凭借其高性能、高可扩展性和灵活的数据模型,在众多领域得到了广泛应用。Python 作为一门功能强大且易于学习的编程语言,拥有丰富的库和工具。pymongo 库为 Python 与 MongoDB 之间搭建了一座桥梁,使得开发者可以方便地在 Python 代码中操作 MongoDB 数据库。本教程将详细介绍如何在 Python 中使用 pymongo 库来操作 MongoDB,从基础的连接、数据操作到高级的索引和聚合操作,让你全面掌握 Python 与 MongoDB 的结合使用。
二、MongoDB 概念介绍
2.1 数据模型
MongoDB 采用面向文档的数据模型,数据以文档(Document)的形式存储。文档是一个由键值对组成的结构,类似于 Python 中的字典,使用 BSON(Binary JSON)格式存储,它是 JSON 的二进制扩展,支持更多的数据类型,如日期、二进制数据等。多个相关的文档组成一个集合(Collection),类似于关系数据库中的表。而多个集合则构成一个数据库(Database)。
2.2 应用场景
- 内容管理系统:可以轻松存储和管理各种类型的内容,如文章、图片、视频等,并且可以灵活地扩展文档结构以适应不同的内容需求。
- 日志记录:处理大量的日志数据,由于其高性能的写入能力和灵活的数据模型,能够快速存储日志信息,并方便后续的查询和分析。
- 实时分析:对于需要实时处理和分析数据的场景,MongoDB 可以高效地存储和处理实时数据,支持复杂的查询和聚合操作。
- 移动应用后端:为移动应用提供数据存储和管理服务,支持多设备的数据同步和实时更新。
三、安装与环境准备
3.1 安装 MongoDB
首先,你需要在本地或者服务器上安装 MongoDB 数据库。可以从 MongoDB 官方网站(Download MongoDB Community Server | MongoDB)下载适合你操作系统的安装包,并按照安装向导进行安装。安装完成后,启动 MongoDB 服务。
3.2 安装 pymongo 库
使用 pip 命令来安装 pymongo 库:
pip install pymongo
四、连接到 MongoDB
在 Python 中使用 pymongo 连接到 MongoDB 服务器非常简单,以下是一个示例代码:
from pymongo import MongoClient# 创建一个 MongoClient 对象,连接到本地的 MongoDB 服务器,默认端口为 27017
client = MongoClient('mongodb://localhost:27017/')# 选择一个数据库,如果该数据库不存在,MongoDB 会在插入数据时自动创建
db = client['test_database']
五、集合操作
在 MongoDB 中,数据以集合(类似于关系数据库中的表)的形式组织。以下是一些常见的集合操作示例:
5.1 创建集合
# 创建一个名为 test_collection 的集合
# 如果集合不存在,MongoDB 会在插入数据时自动创建
collection = db['test_collection']
5.2 查看所有集合
# 获取数据库中的所有集合名称
collection_names = db.list_collection_names()
print("数据库中的所有集合名称:", collection_names)
5.3 删除集合
# 删除 test_collection 集合
db['test_collection'].drop()
print("test_collection 集合已删除")
六、文档操作
在 MongoDB 中,数据以文档(类似于关系数据库中的行)的形式存储在集合中。文档是一个由键值对组成的 BSON 对象。
6.1 插入文档
# 插入单个文档
# 定义一个文档,包含姓名、年龄和城市信息
document = {'name': 'Alice', 'age': 25, 'city': 'New York'}
# 使用 insert_one 方法插入单个文档
result = collection.insert_one(document)
print(f"插入的单个文档 ID: {result.inserted_id}")# 插入多个文档
# 定义一个包含多个文档的列表
documents = [{'name': 'Bob', 'age': 30, 'city': 'Los Angeles'},{'name': 'Charlie', 'age': 35, 'city': 'Chicago'}
]
# 使用 insert_many 方法插入多个文档
result = collection.insert_many(documents)
print(f"插入的多个文档 ID: {result.inserted_ids}")
6.2 查询文档
# 查询单个文档
# 定义查询条件,查找姓名为 Alice 的文档
query = {'name': 'Alice'}
# 使用 find_one 方法查询单个文档
result = collection.find_one(query)
print("查询到的单个文档:", result)# 查询多个文档
# 定义查询条件,查找年龄大于 28 的文档
results = collection.find({'age': {'$gt': 28}})
print("查询到的多个文档:")
for result in results:print(result)
6.3 更新文档
# 更新单个文档
# 定义查询条件,查找姓名为 Alice 的文档
filter_query = {'name': 'Alice'}
# 定义更新操作,将年龄更新为 26
update_query = {'$set': {'age': 26}}
# 使用 update_one 方法更新单个文档
result = collection.update_one(filter_query, update_query)
print(f"更新的单个文档数量: {result.modified_count}")# 更新多个文档
# 定义查询条件,查找城市为 New York 的文档
filter_query = {'city': 'New York'}
# 定义更新操作,将年龄加 1
update_query = {'$inc': {'age': 1}}
# 使用 update_many 方法更新多个文档
result = collection.update_many(filter_query, update_query)
print(f"更新的多个文档数量: {result.modified_count}")
6.4 删除文档
# 删除单个文档
# 定义查询条件,查找姓名为 Alice 的文档
filter_query = {'name': 'Alice'}
# 使用 delete_one 方法删除单个文档
result = collection.delete_one(filter_query)
print(f"删除的单个文档数量: {result.deleted_count}")# 删除多个文档
# 定义查询条件,查找年龄小于 30 的文档
filter_query = {'age': {'$lt': 30}}
# 使用 delete_many 方法删除多个文档
result = collection.delete_many(filter_query)
print(f"删除的多个文档数量: {result.deleted_count}")
七、索引操作
索引可以提高查询性能,以下是创建和删除索引的示例:
7.1 创建索引
# 在 name 字段上创建升序索引
# 提高根据姓名查询文档的性能
collection.create_index([('name', 1)])
print("在 name 字段上创建了升序索引")
7.2 删除索引
# 删除 name 字段上的索引
collection.drop_index('name_1')
print("删除了 name 字段上的索引")
八、聚合操作
聚合操作是 MongoDB 提供的一个强大功能,它允许我们对数据进行复杂的处理和分析,如分组、统计、排序等。
聚合操作通过聚合管道(Aggregation Pipeline)来实现,聚合管道由多个阶段(Stage)组成,每个阶段对输入的文档进行特定的处理,并将处理结果传递给下一个阶段。常见的阶段包括 $match(筛选文档)、$group(分组)、$project(投影)、$sort(排序)、$limit(限制结果数量)等。
以下是一个简单的聚合管道示例,用于按城市分组并统计每个城市的文档数量:
from pymongo import MongoClient# 连接到 MongoDB 服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['test_database']
# 选择集合
collection = db['test_collection']pipeline = [{'$group': {'_id': '$city', 'count': {'$sum': 1}}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)
8.1 结合 $match 和 $group 进行筛选和分组
假设我们想要统计年龄大于 25 岁的人在每个城市的数量。可以先使用 $match 阶段筛选出年龄大于 25 岁的文档,再使用 $group 阶段按城市分组并统计数量。
pipeline = [{'$match': {'age': {'$gt': 25}}},{'$group': {'_id': '$city', 'count': {'$sum': 1}}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)
8.2 使用 $project 进行投影操作
投影操作可以选择要返回的字段,还可以对字段进行计算和重命名。以下示例将返回每个文档的姓名和年龄,并将年龄乘以 2 后重命名为 double_age。
pipeline = [{'$project': {'name': 1, 'double_age': {'$multiply': ['$age', 2]}, '_id': 0}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)
8.3 结合 $sort 进行排序
假设我们想要按年龄降序排列文档,并返回前 2 条记录。可以使用 $sort 阶段进行排序,再使用 $limit 阶段限制结果数量。
pipeline = [{'$sort': {'age': -1}},{'$limit': 2}
]
results = collection.aggregate(pipeline)
for result in results:print(result)
8.4 计算平均值
使用 $group 和 $avg 操作符可以计算某个字段的平均值。以下示例计算所有人的平均年龄。
pipeline = [{'$group': {'_id': None, 'average_age': {'$avg': '$age'}}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)
8.5 字符串拼接
在 $project 阶段可以使用 $concat 操作符进行字符串拼接。以下示例将姓名和城市拼接成一个新的字段 info。
pipeline = [{'$project': {'info': {'$concat': ['$name', ' lives in ', '$city']}, '_id': 0}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)
8.6 多级分组
可以进行多级分组操作,例如先按城市分组,再按年龄范围分组。以下示例将数据先按城市分组,再在每个城市中按年龄是否大于 30 岁进行分组,并统计数量。
pipeline = [{'$group': {'_id': {'city': '$city','age_group': {'$cond': [{'$gt': ['$age', 30]}, 'Over 30', 'Under 30']}},'count': {'$sum': 1}}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)
8.7 使用 $lookup 进行关联查询
假设我们有两个集合:orders 和 products,orders 集合中的每个文档包含一个 product_id 字段,用于关联 products 集合中的产品信息。可以使用 $lookup 阶段进行关联查询,将两个集合的数据进行合并。
# 假设已经有 orders 和 products 集合
orders_collection = db['orders']
products_collection = db['products']pipeline = [{'$lookup': {'from': 'products','localField': 'product_id','foreignField': '_id','as': 'product_info'}}
]
results = orders_collection.aggregate(pipeline)
for result in results:print(result)
8.8、聚合小结
MongoDB 的聚合操作提供了丰富而强大的功能,通过不同阶段的组合,可以对数据进行各种复杂的处理和分析。这里通过多个范例展示了聚合操作在筛选、分组、投影、排序、计算统计值、字符串处理、关联查询等方面的应用。在实际项目中,你可以根据具体需求灵活运用这些范例,结合不同的阶段和操作符,实现更复杂的数据处理和分析任务。希望这些范例能帮助你更好地掌握 MongoDB 的聚合操作,提升数据处理和分析的能力。
九、总结
通过本教程,你全面学习了如何在 Python 中使用 pymongo 库来连接 MongoDB 服务器,进行集合和文档的操作,创建和删除索引,以及使用聚合框架进行数据处理。MongoDB 的灵活性和高性能使其成为处理非结构化数据的理想选择,结合 Python 的强大功能,可以开发出高效的数据处理应用程序。在实际项目中,你可以根据具体需求灵活运用这些操作,充分发挥 MongoDB 和 Python 的优势。
相关文章:
Python 操作 MongoDB 教程
一、引言 在当今数字化时代,数据的存储和管理至关重要。传统的关系型数据库在处理一些复杂场景时可能会显得力不从心,而 NoSQL 数据库应运而生。MongoDB 作为一款开源的、面向文档的 NoSQL 数据库,凭借其高性能、高可扩展性和灵活的数据模型…...
Stability AI 联合 UIUC 提出单视图 3D 重建方法SPAR3D,可0.7秒完成重建并支持交互式用户编辑。
Stability AI 联合 UIUC 提出一种简单而有效的单视图 3D 重建方法 SPAR3D,这是一款最先进的 3D 重建器,可以从单视图图像重建高质量的 3D 网格。SPAR3D 的重建速度很快,只需 0.7 秒,并支持交互式用户编辑。 相关链接 论文…...
网易易盾接入DeepSeek,数字内容安全“智”理能力全面升级
今年农历新年期间,全球AI领域再度掀起了一波革命性浪潮,国产通用大模型DeepSeek凭借其强大的多场景理解与内容生成能力迅速“出圈”,彻底改写全球人工智能产业的格局。 作为国内领先的数字内容风控服务商,网易易盾一直致力于探索…...
自动驾驶---如何打造一款属于自己的自动驾驶系统
在笔者的专栏《自动驾驶Planning决策规划》中,主要讲解了行车的相关知识,从Routing,到Behavior Planning,再到Motion Planning,以及最后的Control,笔者都做了相关介绍,其中主要包括算法在量产上…...
局域网使用Ollama(Linux)
解决局域网无法连接Ollama服务的问题 在搭建和使用Ollama服务的过程中,可能会遇到局域网内无法连接的情况。经过排查发现,若开启了代理软件,尤其是Hiddify,会导致此问题。这一发现耗费了我数小时的排查时间,希望能给大…...
聚焦 AUTO TECH China 2025,共探汽车内外饰新未来Automotive Interiors
全球汽车产业蓬勃发展的大背景下,汽车内外饰作为汽车重要组成部分,其市场需求与技术创新不断推动着行业变革。2025年11月20日至22日,一场备受瞩目的行业盛会 ——AUTO TECH China 2025 广州国际汽车内外饰技术展览会将在广州保利世贸博览馆盛…...
Moretl 增量文件采集工具
永久免费: <下载> <使用说明> 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架构 技术架构: Asp…...
支持多种网络数据库格式的自动化转换工具——VisualXML
一、VisualXML软件介绍 对于DBC、ARXML……文件的编辑、修改等繁琐操作,WINDHILL风丘科技开发的总线设计工具——VisualXML,可轻松解决这一问题,提升工作效率。 VisualXML是一个强大且基于Excel表格生成多种网络数据库文件的转换工具&#…...
mysql8 用C++源码角度看客户端发起sql网络请求,并处理sql命令
MySQL 8 的 C 源码中,处理网络请求和 SQL 命令的流程涉及多个函数和类。以下是关键的函数和类,以及它们的作用: 1. do_command 函数 do_command 函数是 MySQL 服务器中处理客户端命令的核心函数。它从客户端读取一个命令并执行。这个函数在…...
四、OSG学习笔记-基础图元
前一章节: 三、OSG学习笔记-应用基础-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145514021 代码:CuiQingCheng/OsgStudy - Gitee.com 一、绘制盒子模型 下面一个简单的 demo #include<windows.h> #include<osg/Node&…...
使用vllm docker容器部署大语言模型
说明 最近deepseek比较火,我在一台4卡4090的服务器上尝试部署了一下,记录下部署步骤。 安装过程 安卓docker和nvidia-container-toolkit 安装19.03版本以上的docker-ce即可。安装步骤参考清华docker源上的安装步骤:Docker CE 软件仓库 为…...
window 安装GitLab服务器笔记
目录 视频: 资源: Linux CeneOS7: VMware: Linux无法安装 yum install vim -y 1.手动创建目录 2.下载repo PS 补充视频不可复制的代码 安装GitLab *修改root用户密码相关(我卡在第一步就直接放弃了这个操作&…...
MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 10
第10章_创建和管理表 DDL:数据定义语言。CREATE \ALTER\ DROP \RENAME TRUNCATE DML:数据操作语言。INSERT \DELETE \UPDATE \SELECT(重中之重) DCL:数据控制语言。COMMIT \…...
react项目引入tailwindcss不生效解决方案
根据tailwindcss官网的操作步骤下来,样式未生效,且未报错,看了挺多的资料,还是并未解决。 后面在另一个项目尝试时,报了下面的问题: Error: PostCSS plugin tailwindcss requires PostCSS 8 根据这个链接…...
Expo运行模拟器失败错误解决(xcrun simctl )
根据你的描述,问题主要涉及两个方面:xcrun simctl 错误和 Expo 依赖版本不兼容。以下是针对这两个问题的解决方案: 解决 xcrun simctl 错误 错误代码 72 通常表明 simctl 工具未正确配置或路径未正确设置。以下是解决步骤: 确保 …...
【系统架构设计师】体系结构文档化
目录 1. 说明2. 重要性3. 主要内容4. 编写原则5. 实践建议6. 例题6.1 例题1 1. 说明 1.绝大多数的体系结构都是抽象的,由一些概念上的构建组成。2.层的概念在任何程序设计语言中都不存在。3.要让系统分析员和程序员去实现体系结构,还必须将体系结构进行…...
【0403】Postgres内核 检查(procArray )给定 db 是否有其他 backend process 正在运行
文章目录 1. 给定 db 是否有其他 backend 正在运行1.1 获取 allPgXact[] 索引1.1.1 MyProc 中 databaseId 初始化实现1.2 allProcs[] 中各 databaseId 判断1. 给定 db 是否有其他 backend 正在运行 CREATE DATABASE 语句创建用户指定 数据库名(database-name)时候, 会通过 …...
前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截
2个月前AdBlock/AdBlock Plus疑似升级了一次 因为自己主要负责面对海外的用户项目,发现以前的检测AdBlock/AdBlock Plus开启状态方法已失效了,于是专门研究了一下。并尝试了很多方法。 已失效的老方法 // 定义一个检测 AdBlock 的函数 function chec…...
微信小程序(第一集)
app.json {// 定义小程序的所有页面路径,数组中的第一个页面是首页"pages": ["pages/index/index", // 首页"pages/logs/logs" // 日志页面],// 设置小程序的全局窗口外观(比如导航栏和背景颜色)"wind…...
flutter ListView Item复用源码解析
Flutter 的 ListView 的 Item 复用机制是其高性能列表渲染的核心,底层实现依赖于 Flutter 的渲染管线、Element 树和 Widget 树的协调机制。以下是 ListView 复用机制的源码级解析,结合关键类和核心逻辑进行分析。 1. ListView 的底层结构 ListView 的复…...
《Operating System Concepts》阅读笔记:p9-p12
《Operating System Concepts》学习第 3 天,p9-p12 总结,总计 4 页。 一、技术总结 1.interrupt interrupt具有优先级(priority)。 2.storage 指令只能在 memory 上执行,所以要执行程序,那么就要加载到内存上。 (1)RAM Gen…...
html文件怎么转换成pdf文件,2025最新教程
将HTML文件转换成PDF文件,可以采取以下几种方法: 一、使用浏览器内置功能 打开HTML文件:在Chrome、Firefox、IE等浏览器中打开需要转换的HTML文件。打印对话框:按下CtrlP(Windows)或CommandP(M…...
【SpringBoot实现全局API限频】 最佳实践
在 Spring Boot 中实现全局 API 限频(Rate Limiting)可以通过多种方式实现,这里推荐一个结合 拦截器 Redis 的分布式解决方案,适用于生产环境且具备良好的扩展性。 方案设计思路 核心目标:基于客户端标识(…...
科技查新过不了怎么办
“科技查新过不了怎么办?” “科技查新不通过的原因是什么?” 想必这些问题一直困扰着各位科研和学术的朋友们,尤其是对于查新经验不够多的小伙伴,在历经千难万险,从选择查新机构、填写线上委托单到付费,…...
设计模式-结构型-外观模式
在软件开发中,随着功能的不断迭代,系统会变得越来越复杂,模块之间的依赖关系也会越来越深。这种复杂性会导致代码难以理解、维护和扩展。而外观模式(Facade Pattern)正是为了解决这一问题而生的。 一、外观模式简介 …...
超详细的数据结构3(初阶C语言版)栈和队列。
文章目录 栈和队列1.栈1.1 概念与结构1.2 栈的实现 2. 队列2.1 概念与结构2.2 队列的实现 总结 栈和队列 1.栈 1.1 概念与结构 栈:⼀种特殊的线性表,其只允许在固定的⼀端进行插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另…...
centos 7 关于引用stdatomic.h的问题
问题:/tmp/tmp4usxmdso/main.c:6:23: fatal error: stdatomic.h: No such file or directory #include <stdatomic.h> 解决步骤: 1.这个错误是因为缺少C编译器的标准原子操作头文件 stdatomic.h。在Linux系统中,我们需要安装开发工具…...
Unity WebGL包体压缩
最近在开发webgl,踩了很多坑,先来说下包体的问题。 开发完之后发现unity将文件都合并到一个文件了,一共有接近100m。 这对网页端的体验来说是可怕的,因为玩家必须要加载完所有的文件才能进入,这样体验特别差。 于是想…...
【对比测评】 .NET 应用的 Web 视图控件:DotNetBrowser 或 EO.WebBrowser
您是否需要 .NET 应用的 Web 视图控件?.NET 生态系统提供了很多东西,有免费的 Web 视图控件,既有开源的,也有专有的。还有一些商业 Web 视图 控件,也是企业经常选择的一种选项。 在这篇博文中,我们比较了商…...
5.实时推荐系统的设计与实现
接下来我们将学习实时推荐系统的设计与实现。实时推荐系统需要处理大规模数据,并在用户交互时提供即时的推荐结果。这一课我们将介绍以下内容: 实时推荐系统的基本概念实时推荐系统的架构设计实时推荐系统的关键技术实践示例 1. 实时推荐系统的基本概念…...
