当前位置: 首页 > news >正文

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. 创建&#xff08;插入&#xff09;文档插入单个文档插入多个文档 4. 查询文档查询单个文档查询多个文档复杂查询嵌套查询分页条件查询&#xff08;通用模版&#xff09; 5. 更新文档更新单个文档更新多个文档更新嵌…...

【JS】期约的Promise.all()和 Promise.race()区别

概述 Promise.all() 和 Promise.race() 都是 JavaScript 中处理多个异步操作的 Promise 方法&#xff0c;但它们的行为和返回结果有所不同。 Promise.all()和Promise.race() 1. Promise.all() Promise.all() 接受一个由多个 Promise 实例组成的可迭代对象&#xff08;例如数…...

使用 RxJS 库实现响应式编程

什么是 RxJS&#xff1f; RxJS&#xff08;Reactive Extensions for JavaScript&#xff09;是一个用于响应式编程的库&#xff0c;它使得处理异步数据流变得更加简单和优雅。通过使用 Observables&#xff08;可观察对象&#xff09;&#xff0c;你可以轻松地处理事件、HTTP …...

ARP攻击的原理和实现 (网络安全)

ARP攻击的原理和实现 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是一种网络协议&#xff0c;用于在局域网内将IP地址映射到MAC地址。在以太网中&#xff0c;设备通过广播ARP请求来查询目标IP地址对应的MAC地址&#xff0c;从而建立通信…...

chatgpt model spec 2024

概述 这是模型规范的初稿&#xff0c;该文档规定了我们在OpenAI API和ChatGPT中的模型的期望行为。它包括一组核心目标&#xff0c;以及关于如何处理冲突目标或指令的指导。 我们打算将模型规范作为研究人员和数据标注者创建数据的指南&#xff0c;这是一种称为从人类反馈中进…...

单片机-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型号的复杂特性之前&#xff0c;我们首先需要明确其基本参数和功能。这款型号的LED产品以其独特的双色设计和卓越的性能在众多同类产品中脱颖而出。其外观尺寸为3.0x1.0x2.1mm&#xff0c;采用高亮黄光和红光的双色组合&#xff0c;赋予了其在多种应用…...

Appium(一)--- 环境搭建

一、Android自动化环境搭建 1、JDK 必须1.8及以上(1) 安装&#xff1a;默认安装(2) 环境变量配置新建JAVA_HOME:安装路径新建CLASSPath%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar在path中增加&#xff1a;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin&#xff1b;(3) 验证…...

量子力学复习

黑体辐射 热辐射 绝对黑体&#xff1a; &#xff08;辐射能力很强&#xff0c;完全的吸收体&#xff0c;理想的发射体&#xff09; 辐射实验规律&#xff1a; 温度越高&#xff0c;能量越大&#xff0c;亮度越亮 温度越高&#xff0c;波长越短 光电效应 实验装置&#xf…...

22408操作系统期末速成/复习(考研0基础上手)

第一部分:计算题&#xff1a; 考察范围&#xff1a;&#xff08;标红的是重点考&#xff09; 第一章&#xff1a;CPU利用率&#xff1a; 第二章&#xff1a; 进程调度算法&#xff08;需要注意不同调度算法的优先级和题目中给出的是否可以抢占【分为可抢占和不可抢占&#xff…...

两种分类代码:独热编码与标签编码

目录 一、说明 二、理解分类数据 2.1 分类数据的类型&#xff1a;名义数据与序数数据 2.2 为什么需要编码 三、什么是独热编码&#xff1f; 3.1 工作原理&#xff1a;独热编码背后的机制 3.2 应用&#xff1a;独热编码的优势 四、什么是标签编码&#xff1f; 4.1 工作原理&…...

51单片机——共阴数码管实验

数码管中有8位数字&#xff0c;从右往左分别为LED1、LED2、...、LED8&#xff0c;如下图所示 如何实现点亮单个数字&#xff0c;用下图中的ABC来实现 P2.2管脚控制A&#xff0c;P2.3管脚控制B&#xff0c;P2.4管脚控制C //定义数码管位选管脚 sbit LSAP2^2; sbit LSBP2^3; s…...

【开源社区openEuler实践】rust_shyper

title: 探索 Rust_Shyper&#xff1a;系统编程的新前沿 date: ‘2024-12-30’ category: blog tags: Rust_ShyperRust 语言系统编程性能与安全 sig: Virt archives: ‘2024-12’ author:way_back summary: Rust_Shyper 作为基于 Rust 语言的创新项目&#xff0c;在系统编程领域…...

LiteFlow 流程引擎引入Spring boot项目集成pg数据库

文章目录 官网地址简要项目引入maven 所需jar包配置 PostgreSQL 数据库表使用LiteFlow配置 yml 文件通过 代码方式使用 liteflow数据库sql 数据在流程中周转 官网地址 https://liteflow.cc/ 简要 如果你要对复杂业务逻辑进行新写或者重构&#xff0c;用LiteFlow最合适不过。…...

阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)

阻抗&#xff08;Impedance&#xff09;、容抗&#xff08;Capacitive Reactance&#xff09;、感抗&#xff08;Inductive Reactance&#xff09; 都是交流电路中描述电流和电压之间关系的参数&#xff0c;但它们的含义、单位和作用不同。下面是它们的定义和区别&#xff1a; …...

旷视科技Java面试题及参考答案

讲一下进程间的通讯方式(如管道、消息队列、共享内存、Socket 等),各有什么特点? 管道(Pipe) 管道是最早出现的进程间通信方式之一,主要用于具有亲缘关系(父子进程)的进程之间通信。 特点: 半双工通信,数据只能单向流动。例如,在一个简单的父子进程通信场景中,父进…...

reactor的Hooks.enableAutomaticContextPropagation();不生效解决方案

1. pom中需要先增加如下的内容 <dependency><groupId>io.micrometer</groupId><artifactId>context-propagation</artifactId><version>1.1.2</version> </dependency> 2. 注意&#xff0c;要看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程序&#xff1a; 2.头文件&#xff1a; 3.cin和cout初识&#xff1a; 4.命名空间&#xff1a; 二.顺序表和vector&#xff08;STL&#xff09; 1.顺序表的基本操作&#xff1a; 2.封装静态顺序表&#xff1a; 3.动态顺序表--vector&#xff1a;…...

【LLM】概念解析 - Tensorflow/Transformer/PyTorch

背景 本文将从算法原理、适用范围、强项、知名大模型的应用、python 调用几个方面&#xff0c;对深度学习框架 TensorFlow、PyTorch 和基于深度学习的模型 Transformer 进行比较。主要作用是基础概念扫盲。 一、 算法原理对比 Transformer Transformer 是一种基于深度学习的…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...