python对mongodb的增删查改
python对mongodb的增删查改
- 1. 安装 pymongo
- 2. 连接 MongoDB
- 3. 创建(插入)文档
- 插入单个文档
- 插入多个文档
- 4. 查询文档
- 查询单个文档
- 查询多个文档
- 复杂查询
- 嵌套查询
- 分页条件查询(通用模版)
- 5. 更新文档
- 更新单个文档
- 更新多个文档
- 更新嵌套文档
- 6. 删除文档
- 删除单个文档
- 删除多个文档
- 7. 处理复杂的文档结构
- 插入带有数组的文档
- 查询嵌套数组中的元素
- 更新嵌套数组中的元素
- 8. 批量操作
- 9. 事务
1. 安装 pymongo
如果没有安装pymongo 库,可以通过以下命令进行安装:
pip install pymongo
2. 连接 MongoDB
在开始操作之前,需要连接到 MongoDB 数据库,可以使用 pymongo 提供的 MongoClient 类来连接到本地或远程的 MongoDB 实例
from pymongo import MongoClient, ReadPreference# 连接到本地的 MongoDB 实例
## client = MongoClient('mongodb://localhost:27017/')
mongo_uri = 'mongodb://user:pwd@localhost:27017/admin'
client = MongoClient(mongo_uri, read_preference=ReadPreference.SECONDARY)# 连接到远程 MongoDB 实例(例如,使用 MongoDB Atlas)
# client = MongoClient('mongodb+srv://<username>:<password>@cluster0.mongodb.net/myFirstDatabase?retryWrites=true&w=majority')# 选择数据库
db = client['mydatabase']# 选择集合
collection = db['mycollection']
3. 创建(插入)文档
MongoDB 中的文档是 JSON 风格的 BSON(Binary JSON)格式,可以使用 insert_one() 和 insert_many() 方法插入单个或多个文档
插入单个文档
# 插入单个文档
document = {"name": "ZhangSan","age": 25,"skills": ["Python", "MongoDB"],"address": {"street": "123 Main St","city": "Macau","zip": "10001"}
}result = collection.insert_one(document)
print("Inserted document ID:", result.inserted_id)
插入多个文档
# 插入多个文档
documents = [{"name": "LiSi","age": 30,"skills": ["Java", "MongoDB"],"address": {"street": "456 Elm St","city": "Chicago","zip": "60601"}},{"name": "WangWu","age": 35,"skills": ["JavaScript", "React"],"address": {"street": "789 Oak St","city": "San Francisco","zip": "94101"}}
]result = collection.insert_many(documents)
print("Inserted document IDs:", result.inserted_ids)
4. 查询文档
MongoDB 提供了丰富的查询功能,可以使用 find_one() 和 find() 方法进行查询
查询单个文档
# 查询单个文档
document = collection.find_one({"name": "Alice"})
print(document)
查询多个文档
# 查询多个文档
cursor = collection.find({"age": {"$gt": 25}})
for doc in cursor:print(doc)
复杂查询
MongoDB 支持复杂的查询操作符,如 $or, $and, $in, $gt, $lt 等
# 复杂查询:查询年龄大于 25 且技能包含 "MongoDB" 的文档
query = {"age": {"$gt": 25},"skills": "MongoDB"
}cursor = collection.find(query)
for doc in cursor:print(doc)
嵌套查询
MongoDB 支持嵌套文档的查询
# 查询地址城市为 "Macau" 的文档
query = {"address.city": "Macau"
}cursor = collection.find(query)
for doc in cursor:print(doc)
分页条件查询(通用模版)
t_table_name = "t_test" # 目标表名
page_size = 2000 # 单次迭代查询页数
cond = {"name":"ZhangSan"} #查询条件,可为空
sort = [("_id", 1)] # 排序条件
cond["address.city"] = {"$eq": "Macau"} #嵌套文档查询条件
num = 0
dealing = False # 用于标识查询处理是否完毕
projection = {"name":1, "age":1} # 过滤输出目标字段,例如只输出name和age字段,可为空,空表示输出完整文档
while(True):for item in log_db[t_table_name].find(cond, sort = sort, projection = projection, limit = page_size):dealing = Truenum = num + 1cond["_id"] = {"$gt": item["_id"]}# TODO 处理业务逻辑if not dealing:breakprint("finish", num) # 统计查询到的数量dealing = False
5. 更新文档
MongoDB 提供了 update_one() 和 update_many() 方法来更新文档。可以使用 $set, $inc, $push, $pull 等更新操作符
更新单个文档
# 更新单个文档
query = {"name": "ZhangSan"}
new_values = {"$set": {"age": 26}}result = collection.update_one(query, new_values)
print("Matched count:", result.matched_count)
print("Modified count:", result.modified_count)
更新多个文档
# 更新多个文档
query = {"age": {"$lt": 35}}
new_values = {"$inc": {"age": 1}} # 将年龄加 1result = collection.update_many(query, new_values)
print("Matched count:", result.matched_count)
print("Modified count:", result.modified_count)
更新嵌套文档
# 更新嵌套文档
query = {"name": "Alice"}
new_values = {"$set": {"address.city": "Los Angeles"}}result = collection.update_one(query, new_values)
print("Matched count:", result.matched_count)
print("Modified count:", result.modified_count)
6. 删除文档
MongoDB 提供了 delete_one() 和 delete_many() 方法来删除文档
删除单个文档
# 删除单个文档
query = {"name": "ZhangSan"}result = collection.delete_one(query)
print("Deleted count:", result.deleted_count)
删除多个文档
# 删除多个文档
query = {"age": {"$gt": 30}}result = collection.delete_many(query)
print("Deleted count:", result.deleted_count)
7. 处理复杂的文档结构
MongoDB 支持非常灵活的文档结构,可以嵌套数组、嵌套对象等
插入带有数组的文档
# 插入带有数组的文档
document = {"name": "David","age": 40,"skills": ["Python", "MongoDB", "Data Science"],"projects": [{"name": "Project A","status": "Completed"},{"name": "Project B","status": "In Progress"}]
}result = collection.insert_one(document)
print("Inserted document ID:", result.inserted_id)
查询嵌套数组中的元素
# 查询项目名为 "Project A" 的文档
query = {"projects.name": "Project A"
}cursor = collection.find(query)
for doc in cursor:print(doc)
更新嵌套数组中的元素
# 更新项目状态为 "Completed" 的文档
query = {"projects.name": "Project B"
}new_values = {"$set": {"projects.$[elem].status": "Completed" # 使用数组过滤器}
}update_result = collection.update_many(query, new_values, array_filters=[{"elem.name": "Project B"}])
print("Matched count:", update_result.matched_count)
print("Modified count:", update_result.modified_count)
8. 批量操作
MongoDB 支持批量操作,可以提高性能。可以使用 bulk_write() 方法进行批量插入、更新、删除等操作
from pymongo import InsertOne, UpdateOne, DeleteOne# 批量操作
requests = [InsertOne({"name": "Eve","age": 29,"skills": ["Python", "JavaScript"]}),UpdateOne({"name": "Bob"},{"$set": {"age": 31}}),DeleteOne({"name": "Charlie"})
]result = collection.bulk_write(requests)
print("Inserted count:", result.inserted_count)
print("Matched count:", result.matched_count)
print("Modified count:", result.modified_count)
print("Deleted count:", result.deleted_count)
9. 事务
对于需要原子性操作的场景,可以使用 MongoDB 的事务功能。事务允许在多个操作中保持一致性
# 事务
from pymongo import MongoClient
from pymongo.errors import ConnectionFailureclient = MongoClient('mongodb://localhost:27017/')
db = client['mydatabase']
collection = db['mycollection']try:with client.start_session() as session:with session.start_transaction():collection.insert_one({"name": "Frank", "age": 33}, session=session)collection.update_one({"name": "Eve"}, {"$set": {"age": 30}}, session=session)
except ConnectionFailure as e:print("Transaction failed:", e)
参考资料
- PyMongo 官方文档
- MongoDB 官方文档
相关文章:
python对mongodb的增删查改
python对mongodb的增删查改 1. 安装 pymongo2. 连接 MongoDB3. 创建(插入)文档插入单个文档插入多个文档 4. 查询文档查询单个文档查询多个文档复杂查询嵌套查询分页条件查询(通用模版) 5. 更新文档更新单个文档更新多个文档更新嵌…...
【JS】期约的Promise.all()和 Promise.race()区别
概述 Promise.all() 和 Promise.race() 都是 JavaScript 中处理多个异步操作的 Promise 方法,但它们的行为和返回结果有所不同。 Promise.all()和Promise.race() 1. Promise.all() Promise.all() 接受一个由多个 Promise 实例组成的可迭代对象(例如数…...
使用 RxJS 库实现响应式编程
什么是 RxJS? RxJS(Reactive Extensions for JavaScript)是一个用于响应式编程的库,它使得处理异步数据流变得更加简单和优雅。通过使用 Observables(可观察对象),你可以轻松地处理事件、HTTP …...
ARP攻击的原理和实现 (网络安全)
ARP攻击的原理和实现 ARP(Address Resolution Protocol,地址解析协议)是一种网络协议,用于在局域网内将IP地址映射到MAC地址。在以太网中,设备通过广播ARP请求来查询目标IP地址对应的MAC地址,从而建立通信…...
chatgpt model spec 2024
概述 这是模型规范的初稿,该文档规定了我们在OpenAI API和ChatGPT中的模型的期望行为。它包括一组核心目标,以及关于如何处理冲突目标或指令的指导。 我们打算将模型规范作为研究人员和数据标注者创建数据的指南,这是一种称为从人类反馈中进…...
单片机-LED实验
1、51工程模版 #include "reg52.h" void main(){ while(1){ } } 2、LED灯亮 #include "reg52.h" sbit LED1P2^0; void main(){ while(1){ LED10; } } 3、LED闪烁 #include "reg52.h" sbit LED1P2^0; //P2大…...
QILSTE H10-C321HRSYYA高亮红光和黄光LED灯珠
在深入探讨H10-C321HRSYYA型号的复杂特性之前,我们首先需要明确其基本参数和功能。这款型号的LED产品以其独特的双色设计和卓越的性能在众多同类产品中脱颖而出。其外观尺寸为3.0x1.0x2.1mm,采用高亮黄光和红光的双色组合,赋予了其在多种应用…...
Appium(一)--- 环境搭建
一、Android自动化环境搭建 1、JDK 必须1.8及以上(1) 安装:默认安装(2) 环境变量配置新建JAVA_HOME:安装路径新建CLASSPath%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar在path中增加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(3) 验证…...
量子力学复习
黑体辐射 热辐射 绝对黑体: (辐射能力很强,完全的吸收体,理想的发射体) 辐射实验规律: 温度越高,能量越大,亮度越亮 温度越高,波长越短 光电效应 实验装置…...
22408操作系统期末速成/复习(考研0基础上手)
第一部分:计算题: 考察范围:(标红的是重点考) 第一章:CPU利用率: 第二章: 进程调度算法(需要注意不同调度算法的优先级和题目中给出的是否可以抢占【分为可抢占和不可抢占ÿ…...
两种分类代码:独热编码与标签编码
目录 一、说明 二、理解分类数据 2.1 分类数据的类型:名义数据与序数数据 2.2 为什么需要编码 三、什么是独热编码? 3.1 工作原理:独热编码背后的机制 3.2 应用:独热编码的优势 四、什么是标签编码? 4.1 工作原理&…...
51单片机——共阴数码管实验
数码管中有8位数字,从右往左分别为LED1、LED2、...、LED8,如下图所示 如何实现点亮单个数字,用下图中的ABC来实现 P2.2管脚控制A,P2.3管脚控制B,P2.4管脚控制C //定义数码管位选管脚 sbit LSAP2^2; sbit LSBP2^3; s…...
【开源社区openEuler实践】rust_shyper
title: 探索 Rust_Shyper:系统编程的新前沿 date: ‘2024-12-30’ category: blog tags: Rust_ShyperRust 语言系统编程性能与安全 sig: Virt archives: ‘2024-12’ author:way_back summary: Rust_Shyper 作为基于 Rust 语言的创新项目,在系统编程领域…...
LiteFlow 流程引擎引入Spring boot项目集成pg数据库
文章目录 官网地址简要项目引入maven 所需jar包配置 PostgreSQL 数据库表使用LiteFlow配置 yml 文件通过 代码方式使用 liteflow数据库sql 数据在流程中周转 官网地址 https://liteflow.cc/ 简要 如果你要对复杂业务逻辑进行新写或者重构,用LiteFlow最合适不过。…...
阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)
阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance) 都是交流电路中描述电流和电压之间关系的参数,但它们的含义、单位和作用不同。下面是它们的定义和区别: …...
旷视科技Java面试题及参考答案
讲一下进程间的通讯方式(如管道、消息队列、共享内存、Socket 等),各有什么特点? 管道(Pipe) 管道是最早出现的进程间通信方式之一,主要用于具有亲缘关系(父子进程)的进程之间通信。 特点: 半双工通信,数据只能单向流动。例如,在一个简单的父子进程通信场景中,父进…...
reactor的Hooks.enableAutomaticContextPropagation();不生效解决方案
1. pom中需要先增加如下的内容 <dependency><groupId>io.micrometer</groupId><artifactId>context-propagation</artifactId><version>1.1.2</version> </dependency> 2. 注意,要看idea是否将context-propagati…...
DS复习提纲模版
数组的插入删除 int SeqList::list_insert(int i, int item) { //插入if (i < 1 || i > size 1 || size > maxsize) {return 0; // Invalid index or list is full}for (int j size-1; j > i-1; j--) { // Shift elements to the rightlist[j1] list[j];}li…...
蓝桥杯备赛:C++基础,顺序表和vector(STL)
目录 一.C基础 1.第一个C程序: 2.头文件: 3.cin和cout初识: 4.命名空间: 二.顺序表和vector(STL) 1.顺序表的基本操作: 2.封装静态顺序表: 3.动态顺序表--vector:…...
【LLM】概念解析 - Tensorflow/Transformer/PyTorch
背景 本文将从算法原理、适用范围、强项、知名大模型的应用、python 调用几个方面,对深度学习框架 TensorFlow、PyTorch 和基于深度学习的模型 Transformer 进行比较。主要作用是基础概念扫盲。 一、 算法原理对比 Transformer Transformer 是一种基于深度学习的…...
从字符流到语义单元:深入理解编译原理中的Token化过程
1. 什么是Token化? 想象一下你正在读一本英文小说,虽然整本书是由字母组成的,但真正有意义的是由字母组合而成的单词。Token化(Tokenization)就是编译器中类似的"单词拆分"过程——它把源代码这个"长字…...
探索现代PyQt/PySide界面设计:从开源项目汲取灵感
1. 为什么需要从开源项目学习界面设计? 刚开始用PyQt或PySide做界面时,我总觉得自己设计的UI特别"土"——按钮排列死板、配色辣眼睛、交互反人类。后来发现,直接研究成熟的开源项目是最快的学习方式。这些项目往往经过多次迭代&…...
ChromePass:终极Chrome密码恢复工具,三分钟找回所有保存的登录信息
ChromePass:终极Chrome密码恢复工具,三分钟找回所有保存的登录信息 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否曾因忘记Chrome浏览器中保存的…...
TwinCAT3 ADS路由死活加不上?别慌,这份保姆级排查清单帮你搞定(附Win7/CE系统差异)
TwinCAT3 ADS路由添加失败全场景排查指南:从原理到实战 想象一下这样的场景:凌晨两点的生产线突然停机,你顶着黑眼圈站在控制柜前,TwinCAT3的ADS路由死活加不上——这种时候需要的不是教科书式的理论,而是能快速定位问…...
物联网设备调试难题:MQTT Explorer如何让MQTT调试可视化、智能化、跨平台
物联网设备调试难题:MQTT Explorer如何让MQTT调试可视化、智能化、跨平台 【免费下载链接】MQTT-Explorer An all-round MQTT client that provides a structured topic overview 项目地址: https://gitcode.com/gh_mirrors/mq/MQTT-Explorer MQTT Explorer是…...
从fMRI到LLM对齐,AGI正经历第3次范式跃迁,错过2026奇点大会等于错过未来10年技术主权,你准备好了吗?
第一章:2026奇点智能技术大会:AGI与认知科学 2026奇点智能技术大会(https://ml-summit.org) 跨学科融合的新范式 本届大会首次设立“神经符号协同实验室”,将fMRI实时解码框架与可微分逻辑编程(Differentiable Logic Programmin…...
别再只盯着数据手册了!手把手教你用MPU6500的DMP实现姿态解算(附STM32代码)
解锁MPU6500的DMP潜能:从寄存器配置到姿态解算实战 在嵌入式运动控制领域,MPU6500凭借其内置的数字运动处理器(DMP)成为许多开发者的首选。但手册中晦涩的寄存器配置和零散的应用笔记常常让人望而却步。本文将带您深入DMP的核心工作机制,通过…...
Kubernetes Pod CrashLoopBackOff 排查指南
Kubernetes Pod CrashLoopBackOff 排查指南 在Kubernetes集群中,Pod是最小的调度单元,而CrashLoopBackOff状态是运维人员经常遇到的棘手问题之一。当Pod因容器反复崩溃而进入此状态时,若不及时排查,可能导致服务不可用。本文将深…...
如何用Python快速掌握严格耦合波分析:光学仿真的终极指南
如何用Python快速掌握严格耦合波分析:光学仿真的终极指南 【免费下载链接】Rigorous-Coupled-Wave-Analysis modules for semi-analytic fourier series solutions for Maxwells equations. Includes transfer-matrix-method, plane-wave-expansion-method, and rig…...
从踩坑到避坑:我的INA226模块调试血泪史(附常见问题排查与校准指南)
从踩坑到避坑:我的INA226模块调试血泪史(附常见问题排查与校准指南) 第一次接触INA226时,我以为这不过是个普通的电流检测模块——接上电源、连好I2C、读取寄存器数据就完事了。直到项目deadline前三天,发现测量数据飘…...
