数据存储:一文掌握存储数据到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 MongoClientdef main():# 连接 MongoDBclient = 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 ConnectionFailureclient = 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 MongoClientwith 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支持。在实际应用中,结合最佳实践,可以构建高性能、可维护的数据存储解决方案。

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

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

相关文章

JavaAPI(线程)

线程简介 进程&#xff08;Process&#xff09; 进程&#xff0c;是正在运行的程序实例&#xff0c;是操作系统进行资源分配的最小单位。 每个进程都有它自己的地址空间和系统资源&#xff08;比如CPU时间&#xff0c;内存空间&#xff0c;磁盘IO等&#xff09;。 多个进程…

冯诺依曼体系结构 ──── linux第8课

目录 冯诺依曼体系结构 关于冯诺依曼&#xff0c;必须强调几点&#xff1a; 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系 输入单元&#xff1a;包括键盘, 鼠标&#xff0c;网卡,扫…

7.1 线性代数进行图像处理

一、图像的奇异值分解介绍 A A A 的奇异值定理就是 A T A A^TA ATA 和 A A T AA^T AAT 的特征值定理。 这是本章的内容的预览。 A A A 有两个奇异向量的集合&#xff08; A T A A^TA ATA 和 A A T AA^T AAT 的特征向量&#xff09;&#xff0c;有一个是正奇异值的集合&#…

Java 大视界 -- Java 大数据在智慧环保污染源监测与预警中的应用(104)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

「慢思考」机理分析:从雪球误差到正确推理概率

在大语言模型&#xff08;LLMs&#xff09;的发展历程中&#xff0c; Scaling Laws [1] 一直是推动性能提升的核心策略。研究表明&#xff0c;随着模型规模和训练数据的增长&#xff0c;LLMs 的表现会不断优化 [2]。然而&#xff0c;随着训练阶段规模的进一步扩大&#xff0c;性…

面试问题——如何解决移动端1px 边框问题?

面试问题——如何解决移动端1px 边框问题&#xff1f; 最近&#xff0c;不少小伙伴向我反映&#xff0c;他们在面试中频繁被问到关于1px边框的问题。这个看似老生常谈的话题&#xff0c;没想到在面试中的出现率依然这么高&#xff0c;着实让我有些意外。对于那些对这个问题感到…

全星研发项目管理APQP软件系统:汽车电子与半导体行业的研发管理利器

全星研发项目管理APQP软件系统&#xff1a;汽车电子与半导体行业的研发管理利器 1. 集成化管理优势 1.1 数据一致性 无缝数据流转&#xff1a;集成平台确保数据在不同模块间无缝流转&#xff0c;避免因工具切换导致的数据错误和重复工作。案例&#xff1a;某汽车电子企业使用…

Cascadeur 技术浅析(二):物理模拟

Cascadeur 的物理模拟算法是其核心功能之一,旨在通过模拟真实世界的物理规律,使角色动画更加自然和逼真。 1. 刚体动力学(Rigid Body Dynamics) a. 基本原理 刚体动力学用于模拟角色的骨骼和关节运动,假设角色的每个部分都是刚体(即不会发生形变的物体)。通过应用牛顿…

点云处理入门--PointNetPointNet++论文与代码详解

基础知识 点云数据&#xff1a; 点云是一种通过三维扫描设备或计算机图形学技术获取的三维空间数据&#xff0c;通常由一系列点组成&#xff0c;每个点包含其在三维空间中的坐标&#xff08;如 x,y,z&#xff09;&#xff0c;有时还可能包含颜色、强度等附加信息。 介绍几种常…

Tomcat介绍

Tomcat是Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun 和其他一些公司及个人共同开发而成。最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现&#xff0c;因为Tomcat 技术先进、性能稳定&…

DeepSeek-R1-Zero:基于基础模型的强化学习

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列四DeepSeek大模型技术系列四》DeepSeek-…

Redis初识

Redis是什么 Redis是一个在内存中存储数据的中间件&#xff0c;它可以用于作为数据库&#xff0c;用于作为数据的缓存&#xff0c;市面上作为数据缓存的不止Redis一家&#xff0c;但为啥我们要学习Redis呢&#xff1f;因为Redis有一些特性和优点&#xff0c;让Reids在市面上脱…

DeepSeek今日连开3源!针对优化的并行策略,梁文锋本人参与开发

DeepSeek开源周第四天&#xff0c;直接痛快「1日3连发」&#xff0c;且全都围绕一个主题&#xff1a; 优化并行策略。 DualPipe&#xff1a;一种创新的双向流水线并行算法&#xff0c;能够完全重叠前向和后向计算-通信阶段&#xff0c;并减少“流水线气泡”。它通过对称的微批…

打印九九乘法表

打印九九乘法表 package struct; ​ public class ForDemo04 {public static void main(String[] args) { ​for (int i 1; i < 9; i) {//System.out.println(1"*"i""(1*i));for (int j 1; j < i; j) {System.out.print(i"*"j"&qu…

机器学习的起点:线性回归Linear Regression

机器学习的起点&#xff1a;线性回归Linear Regression 作为机器学习的起点&#xff0c;线性回归是理解算法逻辑的绝佳入口。我们从定义、评估方法、应用场景到局限性&#xff0c;用生活化的案例和数学直觉为你构建知识框架。 回归算法 一、线性回归的定义与核心原理 定义&a…

DeepSeek 提示词:常见指令类型

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

查询NFT图片地址

前言 有人给我发了nft&#xff0c;但是没有图片&#xff0c;我就很纳闷为什么&#xff0c;所以想一探究竟 解决思路 先说下环境吧 Sepolia 测试网 metamask钱包 需要获取nft的合约地址和token id 钱包内 nft可以查得到 思路&#xff1a; 我的理解就是ERC721有标准的…

一个滑块可变色的Seekbar

因项目需要&#xff0c;做一个如下图的滑动条&#xff0c;要求如下&#xff1a; 1、滑块跟着进度条改变颜色 2、滑块有白色边和内部颜色组成 大体思路&#xff0c;就是背景需要UI按照需求提供&#xff0c;然后变色时&#xff0c;根据滑动回调动态设置对应的颜色。 直接上代码…

重大更新!锂电池剩余寿命预测新增 CALCE 数据集

往期精彩内容&#xff1a; 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门&#xff01;锂电池剩余寿命预测&#xff08;Python&#xff09;-CSDN博客 超强预测模型&#xff1a;二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;BiLSTM-Attention预测模型…

实时时钟(RTC)/日历芯片PCF8563的I2C读写驱动(2):功能介绍

0 参考资料 PCF8563数据手册&#xff08;第 11 版——2015 年 10 月 26 日&#xff09;.pdf 1 功能介绍 1.1 实时时钟&#xff08;RTC&#xff09;/日历 &#xff08;1&#xff09;PCF8563支持实时时钟&#xff08;RTC&#xff09;&#xff0c;提供时、分、秒信息。对应寄存器…