数据存储:一文掌握存储数据到MongoDB详解

文章目录

    • 一、环境准备
      • 1.1 安装MongoDB
      • 1.2 安装Python MongoDB驱动
    • 二、连接到MongoDB
      • 2.1 基本连接
      • 2.2 连接到MongoDB Atlas(云服务)
    • 三、基本CRUD操作
      • 3.1 创建(Create):插入数据
      • 3.2 读取(Read):查询数据
      • 3.3 更新(Update):修改数据
      • 3.4 删除(Delete):删除数据
      • 3.5 完整示例
    • 四、高级操作
      • 4.1 使用索引
      • 4.2 事务处理
      • 4.3 聚合管道
    • 五、使用MongoEngine进行ODM操作
      • 5.1 安装MongoEngine
      • 5.2 定义文档模型
      • 5.3 执行CRUD操作
    • 六、最佳实践
    • 七、总结

MongoDB是一种流行的NoSQL数据库,以其灵活的文档模型和高可扩展性而闻名。Python提供了多种库来与MongoDB进行交互,其中最常用的是pymongo和mongoengine。本文将详细介绍如何使用Python将数据存储到MongoDB,包括环境设置、基本操作(CRUD)、高级功能以及最佳实践。

关于mongo的更多样例请参考:MongoDB基础和进阶

一、环境准备

1.1 安装MongoDB

首先,确保已经在系统中安装并运行了MongoDB。可以从 MongoDB官方网站 下载并安装适合你操作系统的版本。

1.2 安装Python MongoDB驱动

使用pip安装pymongo库,这是Python中最常用的MongoDB驱动。

pip install pymongo

如果需要使用MongoDB的认证功能或其他高级特性,可以考虑安装官方推荐的驱动:

pip install pymongo[srv]

二、连接到MongoDB

2.1 基本连接

以下是使用pymongo连接到MongoDB的基本示例:

from pymongo import MongoClient

# 连接到本地MongoDB实例
client = MongoClient('mongodb://localhost:27017/')

# 选择数据库,如果不存在则会在第一次写入时创建
db = client['mydatabase']

# 选择集合(类似于表),如果不存在则会在第一次插入时创建
collection = db['mycollection']

2.2 连接到MongoDB Atlas(云服务)

如果使用MongoDB Atlas等云服务,连接字符串会包含用户名和密码:

from pymongo import MongoClient

# 替换为你的连接字符串
uri = "mongodb+srv://<username>:<password>@cluster0.mongodb.net/mydatabase?retryWrites=true&w=majority"

client = MongoClient(uri)
db = client['mydatabase']
collection = db['mycollection']

三、基本CRUD操作

3.1 创建(Create):插入数据

插入单条文档

document = {
    "name": "张三",
    "age": 28,
    "email": "zhangsan@example.com"
}

insert_result = collection.insert_one(document)
print(f"插入文档的ID: {insert_result.inserted_id}")

插入多条文档

documents = [
    {"name": "李四", "age": 34, "email": "lisi@example.com"},
    {"name": "王五", "age": 23, "email": "wangwu@example.com"}
]

insert_many_result = collection.insert_many(documents)
print(f"插入文档的IDs: {insert_many_result.inserted_ids}")

3.2 读取(Read):查询数据

查询所有文档

results = collection.find()
for doc in results:
    print(doc)

条件查询

query = {"age": {"$gt": 25}}
results = collection.find(query)
for doc in results:
    print(doc)

投影(选择特定字段)

query = {"name": "张三"}
projection = {"_id": 0, "email": 1}
result = collection.find_one(query, projection)
print(result)

3.3 更新(Update):修改数据

更新单个文档

query = {"name": "李四"}
new_values = {"$set": {"age": 35}}
update_result = collection.update_one(query, new_values)
print(f"匹配的文档数: {update_result.matched_count}, 修改的文档数: {update_result.modified_count}")

更新多个文档

query = {"age": {"$lt": 30}}
new_values = {"$inc": {"age": 1}}
update_result = collection.update_many(query, new_values)
print(f"匹配的文档数: {update_result.matched_count}, 修改的文档数: {update_result.modified_count}")

3.4 删除(Delete):删除数据

删除单个文档

query = {"name": "王五"}
delete_result = collection.delete_one(query)
print(f"删除的文档数: {delete_result.deleted_count}")

删除多个文档

query = {"age": {"$gt": 30}}
delete_result = collection.delete_many(query)
print(f"删除的文档数: {delete_result.deleted_count}")

3.5 完整示例

from pymongo import MongoClient

def main():
    # 连接 MongoDB
    client = MongoClient("mongodb://localhost:27017/")
    print("连接 MongoDB 成功")

    # 选择数据库和集合
    db = client["testdb"]
    collection = db["users"]
    print("数据库和集合已选择")

    try:
        # 插入单条数据
        data = {"name": "张三", "age": 25, "email": "zhangsan@example.com"}
        result = collection.insert_one(data)
        print(f"插入成功,文档 ID: {result.inserted_id}")

        # 插入多条数据
        data = [
            {"name": "李四", "age": 30, "email": "lisi@example.com"},
            {"name": "王五", "age": 28, "email": "wangwu@example.com"}
        ]
        result = collection.insert_many(data)
        print(f"插入成功,文档 IDs: {result.inserted_ids}")

        # 查询所有数据
        print("查询所有数据:")
        results = collection.find()
        for result in results:
            print(result)

        # 条件查询
        print("查询 age 大于 25 的数据:")
        query = {"age": {"$gt": 25}}
        results = collection.find(query)
        for result in results:
            print(result)

        # 更新单条数据
        query = {"name": "张三"}
        new_values = {"$set": {"age": 26}}
        result = collection.update_one(query, new_values)
        print(f"更新成功,匹配文档数: {result.matched_count}, 修改文档数: {result.modified_count}")

        # 删除单条数据
        query = {"name": "张三"}
        result = collection.delete_one(query)
        print(f"删除成功,删除文档数: {result.deleted_count}")
    finally:
        # 关闭连接
        client.close()
        print("MongoDB 连接已关闭")

if __name__ == "__main__":
    main()

运行上述代码后,输出如下:

连接 MongoDB 成功
数据库和集合已选择
插入成功,文档 ID: 651f8b7e4b8e4e1f2c8e4f1a
插入成功,文档 IDs: [651f8b7e4b8e4e1f2c8e4f1b, 651f8b7e4b8e4e1f2c8e4f1c]
查询所有数据:
{'_id': ObjectId('651f8b7e4b8e4e1f2c8e4f1a'), 'name': '张三', 'age': 25, 'email': 'zhangsan@example.com'}
{'_id': ObjectId('651f8b7e4b8e4e1f2c8e4f1b'), 'name': '李四', 'age': 30, 'email': 'lisi@example.com'}
{'_id': ObjectId('651f8b7e4b8e4e1f2c8e4f1c'), 'name': '王五', 'age': 28, 'email': 'wangwu@example.com'}
查询 age 大于 25 的数据:
{'_id': ObjectId('651f8b7e4b8e4e1f2c8e4f1b'), 'name': '李四', 'age': 30, 'email': 'lisi@example.com'}
{'_id': ObjectId('651f8b7e4b8e4e1f2c8e4f1c'), 'name': '王五', 'age': 28, 'email': 'wangwu@example.com'}
更新成功,匹配文档数: 1, 修改文档数: 1
删除成功,删除文档数: 1
MongoDB 连接已关闭

四、高级操作

4.1 使用索引

索引可以提高查询性能。以下是创建索引的示例:

# 创建单字段索引
collection.create_index("email", unique=True)

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

4.2 事务处理

MongoDB支持多文档事务,适用于需要原子性的操作。

from pymongo import MongoClient
from pymongo.errors import ConnectionFailure

client = MongoClient('mongodb://localhost:27017/')
db = client['mydatabase']
collection = db['mycollection']

with client.start_session() as session:
    with session.start_transaction():
        try:
            collection.insert_one({"name": "赵六", "age": 29}, session=session)
            collection.update_one({"name": "张三"}, {"$set": {"age": 28}}, session=session)
        except ConnectionFailure:
            session.abort_transaction()
            print("事务失败,已回滚")

4.3 聚合管道

聚合管道用于数据处理和分析。

pipeline = [
    {"$match": {"age": {"$gt": 25}}},
    {"$group": {"_id": "$name", "total": {"$sum": 1}}},
    {"$sort": {"total": -1}}
]

results = collection.aggregate(pipeline)
for doc in results:
    print(doc)

五、使用MongoEngine进行ODM操作

MongoEngine是一个基于MongoDB的对象文档映射器(ODM),类似于Django ORM,适用于需要更高抽象层次的项目。

5.1 安装MongoEngine

pip install mongoengine

5.2 定义文档模型

from mongoengine import Document, StringField, IntField, connect

# 连接到MongoDB
connect('mydatabase')

class User(Document):
    name = StringField(required=True)
    age = IntField(required=True)
    email = StringField(unique=True)

# 创建文档
user = User(name="孙七", age=27, email="sunqi@example.com")
user.save()

# 查询文档
user = User.objects(name="孙七").first()
print(user.email)

5.3 执行CRUD操作

# 更新
user.age = 28
user.save()

# 删除
user.delete()

# 查询所有
users = User.objects()
for u in users:
    print(u.name, u.age, u.email)

六、最佳实践

​连接管理:使用连接池和上下文管理器来管理MongoDB连接,确保资源合理利用。

from pymongo import MongoClient

with MongoClient('mongodb://localhost:27017/') as client:
    db = client['mydatabase']
    # 执行操作

​索引优化:根据查询需求创建合适的索引,避免全表扫描,提高查询性能。

​数据验证:使用MongoEngine等ODM框架进行数据验证,确保数据一致性。

​安全性

  • 使用认证机制保护MongoDB实例。
  • 避免在代码中硬编码敏感信息,使用环境变量或配置文件管理凭证。
  • ​错误处理:捕获并处理可能的异常(如使用pymongo.errors.PyMongoError ),确保应用的健壮性。

性能优化:对于大规模数据插入,可以使用 insert_many 的 ordered=False 参数来提高性能。

​合理使用事务:事务适用于需要原子性的多文档操作,但不宜滥用,以免影响性能。

七、总结

使用Python存储数据到MongoDB非常灵活且高效。通过pymongo库,可以执行各种CRUD操作,并利用其丰富的功能满足不同的需求。对于需要更高抽象层次的项目,MongoEngine提供了便捷的ODM支持。在实际应用中,结合最佳实践,可以构建高性能、可维护的数据存储解决方案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBatch简单处理多表批量动态更新

项目需要处理一堆表&#xff0c;这些表数据量不是很大都有经纬度信息&#xff0c;但是这些表的数据没有流域信息&#xff0c;需要按经纬度信息计算所属流域信息。比较简单的项目&#xff0c;按DeepSeek提示思索完成开发&#xff0c;AI真好用。 阿里AI个人版本IDEA安装 IDEA中使…

在Linux桌面上创建Idea启动快捷方式

1、在桌面新建idea.desktop vim idea.desktop [Desktop Entry] EncodingUTF-8 NameIntelliJ IDEA CommentIntelliJ IDEA Exec/home/software/idea-2021/bin/idea.sh Icon/home/software/idea-2021/bin/idea.svg Terminalfalse TypeApplication CategoriesApplication;Developm…

将DeepSeek接入vscode的N种方法

接入deepseek方法一:cline 步骤1:安装 Visual Studio Code 后,左侧导航栏上点击扩展。 步骤2:搜索 cline,找到插件后点击安装。 步骤3:在大模型下拉菜单中找到deep seek,然后下面的输入框输入你在deepseek申请的api key,就可以用了 让deepseek给我写了一首关于天气的…

单片机总结【GPIO/TIM/IIC/SPI/UART】

一、GPIO 1、概念 通用输入输出口&#xff1b;开发者可以根据自己的需求将其配置为输入或输出模式&#xff0c;以实现与外部设备进行数据交互、控制外部设备等功能。简单来说&#xff0c;GPIO 就像是计算机或微控制器与外部世界沟通的 “桥梁”。 2、工作模式 工作模式性质特…

Vxe UI 根据vxe-tabs 绑定不同的值,渲染生成不同的 tabls(页签)内容

VxeUI tabs控件&#xff0c;根据绑定不同的内容&#xff0c;动态渲染不同的表格数据放置在不同的 tab 页 效果图如下&#xff1a; 代码实现 <template><vxe-tabs :options"detailTabList"><vxe-tab-pane v-for"(item, index) in detailTabList&…

洛谷 P8705:[蓝桥杯 2020 省 B1] 填空题之“试题 E :矩阵” ← 卡特兰数

【题目来源】 https://www.luogu.com.cn/problem/P8705 【题目描述】 把 1∼2020 放在 21010 的矩阵里。要求同一行中右边的比左边大&#xff0c;同一列中下边的比上边的大。一共有多少种方案? 答案很大&#xff0c;你只需要给出方案数除以 2020 的余数即可。 【答案提交】 …

今日运维之-Mac笔记本python环境问题

1. 问题&#xff1a;MAC升级系统后git报错&#xff1f; Error: Cant create update lock in /usr/local/var/homebrew/locks! Fix permissions by running:sudo chown -R $(whoami) /usr/local/var/homebrew Traceback (most recent call last):11: from /usr/local/Homebrew/…

鸿蒙Next如何自定义标签页

前言 项目需求是展示标签&#xff0c;标签的个数不定&#xff0c;一行展示不行就自行换行。但是&#xff0c;使用鸿蒙原生的 Grid 后发现特别的难看。然后就想着自定义控件。找了官方文档&#xff0c;发现2个重要的实现方法&#xff0c;但是&#xff0c;官方的demo中讲的很少&…

Python - Python连接数据库

Python的标准数据库接口为&#xff1a;Python DB-API&#xff0c;Python DB-API为开发人员提供了数据库应用编程接口。 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个实现库&#xff0c;Python2中则使用mysqldb。 PyMySQL 遵循 Python 数据库 API v2.0 规范&…

(python)Arrow库使时间处理变得更简单

前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…

MySQL的锁机制和锁算法

锁机制和InnoDB锁算法 MyISAM和InnoDB存储引擎使用的锁&#xff1a; MyISAM采用表级锁(table-level locking)。 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 表级锁和行级锁对比&#xff1a; 表级锁&#xff1a; MySQL中锁定 粒度最大 的一种锁&#xff0c;…

PyTorch 源码学习:GPU 内存管理之深入分析 CUDACachingAllocator

因引入 expandable_segments 机制&#xff0c;PyTorch 2.1.0 版本发生了较大变化。本文关注的是 PyTorch 原生的 GPU 内存管理机制&#xff0c;故研究的 PyTorch 版本为 2.0.0。代码地址&#xff1a; c10/cuda/CUDACachingAllocator.hc10/cuda/CUDACachingAllocator.cpp 更多内…

Rk3568驱动开发_驱动编写和挂载_2

1.字符驱动介绍&#xff1a; 字符驱动&#xff1a;按照字节流镜像读写操作的设备&#xff0c;读写数据分先后顺序&#xff0c;例如&#xff1a;点灯、按键、IIC、SPI、等等都是字符设备&#xff0c;这些设备的驱动叫字符驱动设备 Linux应用层如何调用驱动&#xff1a; 字符设…

记录一下在k3s快速创建gitlab

废话不多说&#xff0c;直接上配置文件 需要修改的地方&#xff08;备注都有写&#xff09;&#xff1a; 1.命名空间 namespace 2. claimName 文件挂载 Deployment kind: Deployment apiVersion: apps/v1 metadata:name: gitlabnamespace: cicd # 替换为您的命名空间la…

leetcode 1656. 设计有序流 简单

有 n 个 (id, value) 对&#xff0c;其中 id 是 1 到 n 之间的一个整数&#xff0c;value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流&#xff0c;以 任意 顺序获取 n 个 (id, value) 对&#xff0c;并在多次调用时 按 id 递增的顺序 返回一些值。 实现…

应对现代生活的健康养生指南

在科技飞速发展的现代社会&#xff0c;人们的生活方式发生了巨大改变&#xff0c;随之而来的是一系列健康问题。快节奏的生活、高强度的工作以及电子产品的过度使用&#xff0c;让我们的身体承受着前所未有的压力。因此&#xff0c;掌握正确的健康养生方法迫在眉睫。 针对久坐不…

大连本地知识库的搭建--数据收集与预处理_01

1.马蜂窝爬虫 编程语言&#xff1a;Python爬虫框架&#xff1a;Selenium&#xff08;用于浏览器自动化&#xff09;解析库&#xff1a;BeautifulSoup&#xff08;用于解析HTML&#xff09; 2.爬虫策略 目标网站&#xff1a;马蜂窝&#xff08;https://www.mafengwo.cn/&…

SQL笔记#复杂查询

一、视图 1、视图和表 使用试图时会执行SELECT语句并创建一张临时表。视图中保存的是SELECT语句;表中保存的是实际数据。 2、创建视图的方法 CREATE VIEW 视图名称(<视图列名1>,<视图列名2>,……) AS <SELECT语句> CREATE VIEW ProductSum (prod…

文件系统

目录 1.认识磁盘 磁盘的物理结构 CHS定位法 磁盘的逻辑结构 2.认识文件系统 inode 分区和分组 磁盘上的文件系统 3.软硬链接 软链接 软链接的操作 创建软链接 查看软链接 删除软链接 软链接的特点 软链接的使用场景 硬链接 硬链接的操作 创建硬链接 查看硬…

学习路之PHP --TP6异步执行功能 (无需安装任何框架)

学习路之PHP --异步执行功能 &#xff08;无需安装任何框架&#xff09; 简介一、工具类二、调用三、异步任务的操作四、效果&#xff1a; 简介 执行异步任务是一种很常见的需求&#xff0c;如批量发邮箱&#xff0c;短信等等执行耗时任务时&#xff0c;需要程序异步执行&…