Python 操纵 MongoDB 教程

打印 上一主题 下一主题

主题 1291|帖子 1291|积分 3873

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、弁言

在当今数字化时代,数据的存储和管理至关紧张。传统的关系型数据库在处置惩罚一些复杂场景时可能会显得力不从心,而 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 库: 
  1. pip install pymongo
复制代码
四、毗连到 MongoDB

在 Python 中使用 pymongo 毗连到 MongoDB 服务器非常简单,以下是一个示例代码:
  1. from pymongo import MongoClient
  2. # 创建一个 MongoClient 对象,连接到本地的 MongoDB 服务器,默认端口为 27017
  3. client = MongoClient('mongodb://localhost:27017/')
  4. # 选择一个数据库,如果该数据库不存在,MongoDB 会在插入数据时自动创建
  5. db = client['test_database']
复制代码
 五、集合操纵

在 MongoDB 中,数据以集合(类似于关系数据库中的表)的情势组织。以下是一些常见的集合操纵示例:
5.1 创建集合

  1. # 创建一个名为 test_collection 的集合
  2. # 如果集合不存在,MongoDB 会在插入数据时自动创建
  3. collection = db['test_collection']
复制代码
5.2 查看所有集合

  1. # 获取数据库中的所有集合名称
  2. collection_names = db.list_collection_names()
  3. print("数据库中的所有集合名称:", collection_names)
复制代码
5.3 删除集合

  1. # 删除 test_collection 集合
  2. db['test_collection'].drop()
  3. print("test_collection 集合已删除")
复制代码
六、文档操纵

在 MongoDB 中,数据以文档(类似于关系数据库中的行)的情势存储在集合中。文档是一个由键值对组成的 BSON 对象。
6.1 插入文档

  1. # 插入单个文档
  2. # 定义一个文档,包含姓名、年龄和城市信息
  3. document = {'name': 'Alice', 'age': 25, 'city': 'New York'}
  4. # 使用 insert_one 方法插入单个文档
  5. result = collection.insert_one(document)
  6. print(f"插入的单个文档 ID: {result.inserted_id}")
  7. # 插入多个文档
  8. # 定义一个包含多个文档的列表
  9. documents = [
  10.     {'name': 'Bob', 'age': 30, 'city': 'Los Angeles'},
  11.     {'name': 'Charlie', 'age': 35, 'city': 'Chicago'}
  12. ]
  13. # 使用 insert_many 方法插入多个文档
  14. result = collection.insert_many(documents)
  15. print(f"插入的多个文档 ID: {result.inserted_ids}")
复制代码
6.2 查询文档

  1. # 查询单个文档
  2. # 定义查询条件,查找姓名为 Alice 的文档
  3. query = {'name': 'Alice'}
  4. # 使用 find_one 方法查询单个文档
  5. result = collection.find_one(query)
  6. print("查询到的单个文档:", result)
  7. # 查询多个文档
  8. # 定义查询条件,查找年龄大于 28 的文档
  9. results = collection.find({'age': {'$gt': 28}})
  10. print("查询到的多个文档:")
  11. for result in results:
  12.     print(result)
复制代码
6.3 更新文档

  1. # 更新单个文档
  2. # 定义查询条件,查找姓名为 Alice 的文档
  3. filter_query = {'name': 'Alice'}
  4. # 定义更新操作,将年龄更新为 26
  5. update_query = {'$set': {'age': 26}}
  6. # 使用 update_one 方法更新单个文档
  7. result = collection.update_one(filter_query, update_query)
  8. print(f"更新的单个文档数量: {result.modified_count}")
  9. # 更新多个文档
  10. # 定义查询条件,查找城市为 New York 的文档
  11. filter_query = {'city': 'New York'}
  12. # 定义更新操作,将年龄加 1
  13. update_query = {'$inc': {'age': 1}}
  14. # 使用 update_many 方法更新多个文档
  15. result = collection.update_many(filter_query, update_query)
  16. print(f"更新的多个文档数量: {result.modified_count}")
复制代码
6.4 删除文档

  1. # 删除单个文档
  2. # 定义查询条件,查找姓名为 Alice 的文档
  3. filter_query = {'name': 'Alice'}
  4. # 使用 delete_one 方法删除单个文档
  5. result = collection.delete_one(filter_query)
  6. print(f"删除的单个文档数量: {result.deleted_count}")
  7. # 删除多个文档
  8. # 定义查询条件,查找年龄小于 30 的文档
  9. filter_query = {'age': {'$lt': 30}}
  10. # 使用 delete_many 方法删除多个文档
  11. result = collection.delete_many(filter_query)
  12. print(f"删除的多个文档数量: {result.deleted_count}")
复制代码
七、索引操纵

索引可以提高查询性能,以下是创建和删除索引的示例:
7.1 创建索引

  1. # 在 name 字段上创建升序索引
  2. # 提高根据姓名查询文档的性能
  3. collection.create_index([('name', 1)])
  4. print("在 name 字段上创建了升序索引")
复制代码
7.2 删除索引

  1. # 删除 name 字段上的索引
  2. collection.drop_index('name_1')
  3. print("删除了 name 字段上的索引")
复制代码
八、聚合操纵

聚合操纵是 MongoDB 提供的一个强大功能,它允许我们对数据进行复杂的处置惩罚和分析,如分组、统计、排序等。
聚合操纵通过聚合管道(Aggregation Pipeline)来实现,聚合管道由多个阶段(Stage)组成,每个阶段对输入的文档进行特定的处置惩罚,并将处置惩罚结果传递给下一个阶段。常见的阶段包括 $match(筛选文档)、$group(分组)、$project(投影)、$sort(排序)、$limit(限定结果数量)等。
以下是一个简单的聚合管道示例,用于按都会分组并统计每个都会的文档数量:
  1. from pymongo import MongoClient
  2. # 连接到 MongoDB 服务器
  3. client = MongoClient('mongodb://localhost:27017/')
  4. # 选择数据库
  5. db = client['test_database']
  6. # 选择集合
  7. collection = db['test_collection']
  8. pipeline = [
  9.     {'$group': {'_id': '$city', 'count': {'$sum': 1}}}
  10. ]
  11. results = collection.aggregate(pipeline)
  12. for result in results:
  13.     print(result)
复制代码
 8.1 结合 $match 和 $group 进行筛选和分组

假设我们想要统计年事大于 25 岁的人在每个都会的数量。可以先使用 $match 阶段筛选出年事大于 25 岁的文档,再使用 $group 阶段按都会分组并统计数量。
  1. pipeline = [
  2.     {'$match': {'age': {'$gt': 25}}},
  3.     {'$group': {'_id': '$city', 'count': {'$sum': 1}}}
  4. ]
  5. results = collection.aggregate(pipeline)
  6. for result in results:
  7.     print(result)
复制代码
8.2 使用 $project 进行投影操纵

投影操纵可以选择要返回的字段,还可以对字段进行计算和重定名。以下示例将返回每个文档的姓名和年事,并将年事乘以 2 后重定名为 double_age。
  1. pipeline = [
  2.     {'$project': {'name': 1, 'double_age': {'$multiply': ['$age', 2]}, '_id': 0}}
  3. ]
  4. results = collection.aggregate(pipeline)
  5. for result in results:
  6.     print(result)
复制代码
 8.3 结合 $sort 进行排序

假设我们想要按年事降序分列文档,并返回前 2 条记录。可以使用 $sort 阶段进行排序,再使用 $limit 阶段限定结果数量。
  1. pipeline = [
  2.     {'$sort': {'age': -1}},
  3.     {'$limit': 2}
  4. ]
  5. results = collection.aggregate(pipeline)
  6. for result in results:
  7.     print(result)
复制代码
8.4 计算平均值

使用 $group 和 $avg 操纵符可以计算某个字段的平均值。以下示例计算所有人的平均年事。
  1. pipeline = [
  2.     {'$group': {'_id': None, 'average_age': {'$avg': '$age'}}}
  3. ]
  4. results = collection.aggregate(pipeline)
  5. for result in results:
  6.     print(result)
复制代码
 8.5 字符串拼接

在 $project 阶段可以使用 $concat 操纵符进行字符串拼接。以下示例将姓名和都会拼接成一个新的字段 info。
  1. pipeline = [
  2.     {'$project': {'info': {'$concat': ['$name', ' lives in ', '$city']}, '_id': 0}}
  3. ]
  4. results = collection.aggregate(pipeline)
  5. for result in results:
  6.     print(result)
复制代码
8.6 多级分组

可以进行多级分组操纵,例如先按都会分组,再按年事范围分组。以下示例将数据先按都会分组,再在每个都会中按年事是否大于 30 岁进行分组,并统计数量。 
  1. pipeline = [
  2.     {'$group': {
  3.         '_id': {
  4.             'city': '$city',
  5.             'age_group': {'$cond': [{'$gt': ['$age', 30]}, 'Over 30', 'Under 30']}
  6.         },
  7.         'count': {'$sum': 1}
  8.     }}
  9. ]
  10. results = collection.aggregate(pipeline)
  11. for result in results:
  12.     print(result)
复制代码
8.7 使用 $lookup 进行关联查询

假设我们有两个集合:orders 和 products,orders 集合中的每个文档包罗一个 product_id 字段,用于关联 products 集合中的产物信息。可以使用 $lookup 阶段进行关联查询,将两个集合的数据进行合并。
  1. # 假设已经有 orders 和 products 集合
  2. orders_collection = db['orders']
  3. products_collection = db['products']
  4. pipeline = [
  5.     {
  6.         '$lookup': {
  7.             'from': 'products',
  8.             'localField': 'product_id',
  9.             'foreignField': '_id',
  10.             'as': 'product_info'
  11.         }
  12.     }
  13. ]
  14. results = orders_collection.aggregate(pipeline)
  15. for result in results:
  16.     print(result)
复制代码
 8.8、聚合小结

MongoDB 的聚合操纵提供了丰富而强大的功能,通过不同阶段的组合,可以对数据进行各种复杂的处置惩罚和分析。这里通过多个范例展示了聚合操纵在筛选、分组、投影、排序、计算统计值、字符串处置惩罚、关联查询等方面的应用。在实际项目中,你可以根据详细需求机动运用这些范例,结合不同的阶段和操纵符,实现更复杂的数据处置惩罚和分析使命。希望这些范例能帮助你更好地把握 MongoDB 的聚合操纵,提升数据处置惩罚和分析的本领。
九、总结

通过本教程,你全面学习了如安在 Python 中使用 pymongo 库来毗连 MongoDB 服务器,进行集合和文档的操纵,创建和删除索引,以及使用聚合框架进行数据处置惩罚。MongoDB 的机动性和高性能使其成为处置惩罚非结构化数据的理想选择,结合 Python 的强大功能,可以开辟出高效的数据处置惩罚应用步伐。在实际项目中,你可以根据详细需求机动运用这些操纵,充实发挥 MongoDB 和 Python 的优势。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦应逍遥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表