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 和 productsorders 集合中的每个文档包含一个 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 的优势。

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

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

相关文章

DeepSeek本地化部署

DeepSeek本地化部署 本教程为一键式部署,适合于mac、ubuntu、windows。【开源地址】 环境要求 nodejs > 18Python > 3.10.12 步骤一:安装ollama客户端 官网直接安装,ollama官网。安装完成后使用命令:ollama -h&#xf…

大数据与大模型:数字时代的共生力量

引言:大数据与大模型的崭新时代 在数字化浪潮汹涌澎湃的当下,大数据与大模型无疑是最为耀眼的两颗明星 ,深刻地改变着我们的生活、工作和思维方式。大数据,作为信息时代的宝藏,蕴含着无尽的价值。从电商平台的海量交易…

[2025年最新]2024.3版本idea无法安装插件问题解决

背景 随着大模型的持续发展,特别年前年后deepseek的优异表现,编程过程中,需要解决ai来辅助编程,因此需要安装一些大模型插件 问题描述 在线安装插件的时候会遇到以下问题: 1.数据一直在加载,加载的很满 2.点…

自动驾驶---如何打造一款属于自己的自动驾驶系统

在笔者的专栏《自动驾驶Planning决策规划》中,主要讲解了行车的相关知识,从Routing,到Behavior Planning,再到Motion Planning,以及最后的Control,笔者都做了相关介绍,其中主要包括算法在量产上…

三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab)

三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab) 完整代码私信回复三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab) 一、引言 1、研究背景和意义 在现代数据科学领域,时间序列…

Jenkins+gitee 搭建自动化部署

Jenkinsgitee 搭建自动化部署 环境说明: 软件版本备注CentOS8.5.2111JDK1.8.0_211Maven3.8.8git2.27.0Jenkins2.319最好选稳定版本,不然安装插件有点麻烦 一、安装Jenkins程序 1、到官网下载相应的版本war或者直接使用yum安装 Jenkins官网下载 直接…

AI 编程开发插件codeium Windsurf(vscode、editor) 安装

1、vscode中安装: 2、vscode中使用 3、输入注册的账号密码,就可以使用。 4、或者直接下载editor 5、安装editor 下一步,下一步,直到安装成功,中间可以改下安装位置,如果C盘空间不够。 同样提示注册或者登录…

【Mac排错】ls: command not found 终端命令失效的解决办法

【TroubleShooting on Mac】ls: command not found 终端命令失效的解决办法 A Solution to Solve “Command not found” of Terminal on Mac 一直在使用心爱的MacBook Pro的Terminal,并且为她定制了不同的Profile。 这样,看起来她可以在不同季节&…

河北某石油管廊自动化监测

1. 项目简介 近年来,国家密集出台油气管道建设相关政策和规划引导中国油气管道加快建设,2017年,在《中长期油气管网规划》中对2025年和2030年油气管道发展目标均作出了相应的规划目标。另一方面,随着油气管道行业的发展&#xff…

问题:通过策略模式+工厂模式+模板方法模式实现ifelse优化

项目场景: 提示:这里简述项目相关背景: 示例:商城系统有会员系统,不同会员有不同优惠程度,普通会员不优惠;黄金会员打8折;白金会员优惠50元,再打7折; 问题描…

Android ndk兼容 64bit so报错

1、报错logcat如下 2025-01-13 11:34:41.963 4687-4687 DEBUG pid-4687 A #01 pc 00000000000063b8 /system/lib64/liblog.so (__android_log_default_aborter16) (BuildId: 467c2038cdfa767245f9280e657fdb85) 2025…

centos安装Nexus Repository OSS(Maven私服)

1. 下载链接:https://help.sonatype.com/en/download.html 2. 注意页面下载页面中的要求:JDK17(启动时提示最低JDK1.8最高JDK17,但是使用JDK1.8无法正常启动) 3. mkdir /opt/nexus 将压缩包上传到该目录并解压。 tar …

b站——《【强化学习】一小时完全入门》学习笔记及代码(1-3 多臂老虎机)

问题陈述 我们有两个多臂老虎机(Multi-Armed Bandit),分别称为左边的老虎机和右边的老虎机。每个老虎机的奖励服从不同的正态分布: 左边的老虎机:奖励服从均值为 500,标准差为 50 的正态分布,即…

Linux:安装 node 及 nvm node 版本管理工具(ubuntu )

目录 方法一:手动下载安装文件安装方法二:curl安装 方法一:手动下载安装文件安装 git clone 远程镜像 git clone https://gitee.com/mirrors/nvm安装 nvm bash install.sh刷新配置,使配置在终端生效 // 方法 1 source /root/.…

基于STM32的ADS1230驱动例程

自己在练手项目中用到了ADS1230,根据芯片手册自写的驱动代码,已测可用,希望对将要用到ADS1230芯片的人有所帮助。 芯片:STM32系列任意芯片、ADS1230 环境:使用STM32CubeMX配置引脚、KEIL 部分电路: 代码…

游戏引擎学习第98天

仓库:https://gitee.com/mrxiao_com/2d_game_2 开始进行一点回顾 今天的目标是继续实现正常贴图的操作,尽管目前我们还没有足够的光照信息来使其完全有用。昨日完成了正常贴图相关的基础工作,接下来将集中精力实现正常贴图的基本操作,并准备…

Windows 本地部署大模型 OpenWebUI+Ollama

安装Ollama Ollama官方网址:https://ollama.com 下载运行大模型 在Ollama官网中查看需要下载的大模型 https://ollama.com/library 复制图片中的链接 打开cmd,运行此命令(此过程会时间会很久) 下载Miniconda Miniconda作用是…

npm运行Vue项目报错 error:0308010c:digital envelope routines::unsupported

大家好,我是 程序员码递夫。 问题 VSCode 运行Vue项目,提示错误: building 2/2 modules 0 activeError: error:0308010c:digital envelope routines::unsupported 解决方法 原因是 npm 高版本(大于17),对ssl的处理做了改进&…

安川伺服控制器MP系列优势特点及行业应用

在工业自动化领域,运动控制器的性能直接决定了设备的精度、效率和可靠性。作为全球领先的运动控制品牌,安川电机伺服控制器凭借其卓越的技术优势和广泛的应用场景,正在为智能制造注入强劲动力! MP3100:主板型运动控制…

Python----PyQt开发(PyQt高级:图像显示,定时器,进度条)

一、图像显示 1.1、增加图标 1.直接创建setWindowIcon(QIcon(灯泡.jpg)) import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from PyQt5.QtGui import QIconclass MainWindow(QMainWindow):def __init__(self):super(MainWindow, self).__init_…