Python 操作 MongoDB 教程

news2025/2/13 3:18:13

一、引言

在当今数字化时代,数据的存储和管理至关重要。传统的关系型数据库在处理一些复杂场景时可能会显得力不从心,而 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.coloradmin.cn/o/2297126.html

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

相关文章

Stability AI 联合 UIUC 提出单视图 3D 重建方法SPAR3D,可0.7秒完成重建并支持交互式用户编辑。

Stability AI 联合 UIUC 提出一种简单而有效的单视图 3D 重建方法 SPAR3D,这是一款最先进的 3D 重建器,可以从单视图图像重建高质量的 3D 网格。SPAR3D 的重建速度很快,只需 0.7 秒,并支持交互式用户编辑。 相关链接 论文&#xf…

网易易盾接入DeepSeek,数字内容安全“智”理能力全面升级

今年农历新年期间,全球AI领域再度掀起了一波革命性浪潮,国产通用大模型DeepSeek凭借其强大的多场景理解与内容生成能力迅速“出圈”,彻底改写全球人工智能产业的格局。 作为国内领先的数字内容风控服务商,网易易盾一直致力于探索…

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

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

聚焦 AUTO TECH China 2025,共探汽车内外饰新未来Automotive Interiors

全球汽车产业蓬勃发展的大背景下,汽车内外饰作为汽车重要组成部分,其市场需求与技术创新不断推动着行业变革。2025年11月20日至22日,一场备受瞩目的行业盛会 ——AUTO TECH China 2025 广州国际汽车内外饰技术展览会将在广州保利世贸博览馆盛…

Moretl 增量文件采集工具

永久免费: <下载> <使用说明> 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架构 技术架构: Asp…

支持多种网络数据库格式的自动化转换工具——VisualXML

一、VisualXML软件介绍 对于DBC、ARXML……文件的编辑、修改等繁琐操作&#xff0c;WINDHILL风丘科技开发的总线设计工具——VisualXML&#xff0c;可轻松解决这一问题&#xff0c;提升工作效率。 VisualXML是一个强大且基于Excel表格生成多种网络数据库文件的转换工具&#…

四、OSG学习笔记-基础图元

前一章节&#xff1a; 三、OSG学习笔记-应用基础-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145514021 代码&#xff1a;CuiQingCheng/OsgStudy - Gitee.com 一、绘制盒子模型 下面一个简单的 demo #include<windows.h> #include<osg/Node&…

window 安装GitLab服务器笔记

目录 视频&#xff1a; 资源&#xff1a; Linux CeneOS7&#xff1a; VMware&#xff1a; Linux无法安装 yum install vim -y 1.手动创建目录 2.下载repo PS 补充视频不可复制的代码 安装GitLab *修改root用户密码相关&#xff08;我卡在第一步就直接放弃了这个操作&…

MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 10

第10章_创建和管理表 DDL&#xff1a;数据定义语言。CREATE \ALTER\ DROP \RENAME TRUNCATE DML&#xff1a;数据操作语言。INSERT \DELETE \UPDATE \SELECT&#xff08;重中之重&#xff09; DCL&#xff1a;数据控制语言。COMMIT \…

前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截

2个月前AdBlock/AdBlock Plus疑似升级了一次 因为自己主要负责面对海外的用户项目&#xff0c;发现以前的检测AdBlock/AdBlock Plus开启状态方法已失效了&#xff0c;于是专门研究了一下。并尝试了很多方法。 已失效的老方法 // 定义一个检测 AdBlock 的函数 function chec…

html文件怎么转换成pdf文件,2025最新教程

将HTML文件转换成PDF文件&#xff0c;可以采取以下几种方法&#xff1a; 一、使用浏览器内置功能 打开HTML文件&#xff1a;在Chrome、Firefox、IE等浏览器中打开需要转换的HTML文件。打印对话框&#xff1a;按下CtrlP&#xff08;Windows&#xff09;或CommandP&#xff08;M…

科技查新过不了怎么办

“科技查新过不了怎么办&#xff1f;” “科技查新不通过的原因是什么&#xff1f;” 想必这些问题一直困扰着各位科研和学术的朋友们&#xff0c;尤其是对于查新经验不够多的小伙伴&#xff0c;在历经千难万险&#xff0c;从选择查新机构、填写线上委托单到付费&#xff0c;…

超详细的数据结构3(初阶C语言版)栈和队列。

文章目录 栈和队列1.栈1.1 概念与结构1.2 栈的实现 2. 队列2.1 概念与结构2.2 队列的实现 总结 栈和队列 1.栈 1.1 概念与结构 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进行插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶&#xff0c;另…

centos 7 关于引用stdatomic.h的问题

问题&#xff1a;/tmp/tmp4usxmdso/main.c:6:23: fatal error: stdatomic.h: No such file or directory #include <stdatomic.h> 解决步骤&#xff1a; 1.这个错误是因为缺少C编译器的标准原子操作头文件 stdatomic.h。在Linux系统中&#xff0c;我们需要安装开发工具…

Unity WebGL包体压缩

最近在开发webgl&#xff0c;踩了很多坑&#xff0c;先来说下包体的问题。 开发完之后发现unity将文件都合并到一个文件了&#xff0c;一共有接近100m。 这对网页端的体验来说是可怕的&#xff0c;因为玩家必须要加载完所有的文件才能进入&#xff0c;这样体验特别差。 于是想…

【对比测评】 .NET 应用的 Web 视图控件:DotNetBrowser 或 EO.WebBrowser

您是否需要 .NET 应用的 Web 视图控件&#xff1f;.NET 生态系统提供了很多东西&#xff0c;有免费的 Web 视图控件&#xff0c;既有开源的&#xff0c;也有专有的。还有一些商业 Web 视图 控件&#xff0c;也是企业经常选择的一种选项。 在这篇博文中&#xff0c;我们比较了商…

Redis 数据类型 String 字符串

Redis 中的 String 数据类型 是最基础且使用最广泛的数据类型之一。它本质上是一个字节序列&#xff0c;可以存储各种类型的数据&#xff0c;如字符串、整数、浮点数等&#xff0c;其字符串类型的值包含⼀般格式的字符串或者类似 JSON、XML 格式的字符串&#xff1b;还可以存储…

查询语句来提取 detail 字段中包含 xxx 的 URL 里的 commodity/ 后面的数字串

您可以使用以下 SQL 查询语句来提取 detail 字段中包含 oss.kxlist.com 的 URL 里的 commodity/ 后面的数字串&#xff1a; <p><img style"max-width:100%;" src"https://oss.kxlist.com//8a989a0c55e4a7900155e7fd7971000b/commodity/20170925/20170…

业务开发 | 基础知识 | Maven 快速入门

Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中央信息中管理项目的构建&#xff0c;报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…

机器学习 - 词袋模型(Bag of Words)实现文本情感分类的详细示例

为了简单直观的理解模型训练&#xff0c;我这里搜集了两个简单的实现文本情感分类的例子&#xff0c;第一个例子基于朴素贝叶斯分类器&#xff0c;第二个例子基于逻辑回归&#xff0c;通过这两个例子&#xff0c;掌握词袋模型&#xff08;Bag of Words&#xff09;实现文本情感…