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

Python 操作 MongoDB 详解

嗨害大家好鸭!我是芝士❤

在这里插入图片描述

一、前言

MongoDB属于 NoSQL(非关系型数据库),
是一个基于分布式文件存储的开源数据库系统。

二、操作 MongoDB

1. 安装 pymongo

python 使用第三方库来连接操作 MongoDB,
所以我们首先安装此库。

pip3 install pymongodb

2. 连接 MongoDB

使用 MongoClient 类连接,
以下两种参数方式都可以:

from pymongo import MongoClient# 连接方式一
client = MongoClient(host='localhost',port=27017)
# 连接方式二
# client = MongoClient('mongodb://localhost:27017/学习资料无偿领扣扣qun:540305994')

3. 选择数据库

MongoDB 可以创建很多 db,
指定我们需要的 db 即可

# 方式一
db = client.Monitor
# 方式二
# db = client['Monitor']

4. 选择集合

db 内包含很多个集合,
有点类似 mysql 这类关系型数据库中的表

# 方式一
collection = db.test
# 方式二
# collection = db['test']

5. 插入数据

插入一条数据,
MongoDB 每条记录都有一个唯一标识。
返回一个 InsertOneResult 对象,
若需要获取唯一标识,
找到 InsertOneResult 对象的属性 inserted_id 即可

from pymongo import MongoClientclass mongodb:def __init__(self,host,db,port = 27017):''':param host: str mongodb地址:param db: str 数据库:param port: int 端口,默认为27017'''host = hostdb = dbself.port = portclient = MongoClient(host=host,port=port)self.db = client[db]def insert_one(self,table,dic):''':param table: str 数据库中的集合:param dic: dict 要插入的字典:return: 返回一个包含ObjectId类型的对象'''collection = self.db[table]rep = collection.insert_one(dic)return rep
if __name__=='__main__':dic = {'姓名':'小明','English':100,'math':90}db = mongodb(host='localhost',db = 'test')rep = db.insert_one('test',dic)print(rep.inserted_id)

插入多条数据,使用 insert_many 批量插入

from pymongo import MongoClientclass mongodb:def __init__(self,host,db,port = 27017):''':param host: str mongodb地址:param db: str 数据库:param port: int 端口,默认为27017'''host = hostdb = dbself.port = portclient = MongoClient(host=host,port=port)self.db = client[db]def insert_one(self,table,dic):''':param table: str 数据库中的集合:param dic: dict 要插入的字典:return: 返回包含一个ObjectId类型的对象'''collection = self.db[table]rep = collection.insert_one(dic)return repdef insert_many(self,table,lists):''':param table: str 数据库中的集合:param dic: dict 要插入的列表,列表中的元素为字典:return: 返回包含多个ObjectId类型的列表对象'''collection = self.db[table]rep = collection.insert_many(lists)return repif __name__=='__main__':lists = [{'姓名':'小明','English':100,'math':90},{'姓名':'小华','English':90,'math':100}]db = mongodb(host='localhost',db = 'test')rep = db.insert_many('test',lists)for i in rep.inserted_ids:print(i)

6. 查询

1)常规查询

  • find_one :查询单条记录,返回一个字典。
  • find:查询多条记录 ,返回一个游标对象。
from pymongo import MongoClientclass mongodb:def __init__(self,host,db,port = 27017):''':param host: str mongodb地址:param db: str 数据库:param port: int 端口,默认为27017'''host = hostdb = dbself.port = portclient = MongoClient(host=host,port=port)self.db = client[db]def find_one(self,table,dic):''':param table: str 数据库中的集合:param dic: dict 查询条件:return: dict 返回单条记录的字典'''collection = self.db[table]rep = collection.find_one(dic)return repdef find(self,table,dic):''':param table: str 数据库中的集合:param dic: dict 查询条件:return: list 返回查询到记录的列表'''collection = self.db[table]rep = list(collection.find(dic))return repif __name__=='__main__':# 查询 English 成绩为 100 的所有记录dic = {'English':100}db = mongodb(host='localhost',db = 'test')rep = db.find('test',dic)print(rep)

2)范围查询

有时候我们需要范围比较查询,
比如要查询 English 成绩为 80~90 ,
可以使用比较符:dic = {'English':{'$in':[80,90]}}

  • $lt :小于
  • $lte:小于等于
  • $gt:大于
  • $gte:大于等于
  • $ne:不等于
  • $in:在范围内
  • $nin:不在范围内

3)模糊查询

如果想要类似这种 sql 语句查询:
select * from db where name like '%abc%'
在 MongoDB 中可以通过正则表达式来实现

# 模糊搜索key为"姓名",value包含"明"的记录
dic = {'姓名':{'$regex':'明'}}
rep = list(collection.find(dic))

4)字段筛选

如果只想返回指定的字段,使用 find(find_one)方法时加上 projection 参数。类似 sql 语法:select Englist from db where name like ‘%abc%’

# projection字典参数。1显示,0不显示
# 以下查询结果只返回key为English的相关字段
rep = list(collection.find(dic,projection={'English':1,'_id':0}))

5)计数

直接调用 count() 方法,返回一个 int 类型的数字

# 计数查询只需要在普通查询后加上 count() 即可
count = collection.find().count()  
# count = collection.find({'English':{'$gt':90}}).count()

6)排序

排序时,直接调用sort()方法,并在其中传入排序的字段及升降序标志,返回一个游标对象# 正序 ASCENDING,倒序 DESCENDING。list()将游标对象转成列表
data = list(collection.find(dic).sort('姓名',pymongo.DESCENDING))

7. 更新数据

首选查到需要更新的数据,然后将该数据更新,返回一个 UpdataResult 对象, raw_result 属性中包含 update 生效的个数。

  • update_one:更新查询到的第一条数据
  • update_many:更新多条数据
from pymongo import MongoClientclass mongodb:def __init__(self,host,db,port = 27017):''':param host: str mongodb地址:param db: str 数据库:param port: int 端口,默认为27017'''host = hostdb = dbself.port = portclient = MongoClient(host=host,port=port)self.db = client[db]def update_one(self,table,condition,dic):''':param table: str 数据库中的集合:param condition: dict 查询条件:param dic: dict 更新的数据:return: 返回UpdateResult对象'''collection = self.db[table]# $set 表示只更新dic字典内存在的字段rep = collection.update_one(condition,{'$set':dic})# 会把之前的数据全部用dic字典替换,如果原本存在其他字段,则会被删除# rep = collection.update_one(condition, dic)return repdef update_many(self,table,condition,dic):''':param table: str 数据库中的集合:param condition: dict 查询条件:param dic: dict 更新的数据:return:返回UpdateResult对象'''collection = self.db[table]# $set 表示只更新dic字典内存在的字段rep = collection.update_many(condition,{'$set':dic})# 会把之前的数据全部用dic字典替换,如果原本存在其他字段,则会被删除# rep = collection.update_many(condition, dic)return repif __name__=='__main__':condition = {'English':80}dic = {'English':60}db = mongodb(host='mongodb-monitor.monitor.svc.test.local',db = 'test')rep = db.update_one('test',condition,dic)print(rep.raw_result)# 输出 {'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}

8. 删除

删除和 update 类似,删除数据后,返回一个 DeleteResult 对象, raw_result 属性中包含 delete 的个数

  • delete_one:删除查询到的第一条数据
  • delete_many:批量删除符合查询条件的数据
from pymongo import MongoClientclass mongodb:def __init__(self,host,db,port = 27017):''':param host: str mongodb地址:param db: str 数据库:param port: int 端口,默认为27017'''host = hostdb = dbself.port = portclient = MongoClient(host=host,port=port)self.db = client[db]def delete_one(self,table,dic):''':param table: str 数据库中的集合:param dic: dict 查询条件:return: 返回DeleteResult对象'''collection = self.db[table]rep = collection.delete_one(dic)return repdef delete_many(self,table,dic):''':param table: str 数据库中的集合:param dic: dict 查询条件:return: 返回DeleteResult对象'''collection = self.db[table]rep = collection.delete_many(dic)return repif __name__=='__main__':dic = {'English':60}db = mongodb(host='localhost',db = 'test')rep = db.delete_many('test',dic)print(rep.raw_result)# 输出 {'n': 21, 'ok': 1.0}

今天的文章就是这样~

我们下篇文章再见啦(✿◡‿◡)

在这里插入图片描述

相关文章:

Python 操作 MongoDB 详解

嗨害大家好鸭!我是芝士❤ 一、前言 MongoDB属于 NoSQL(非关系型数据库), 是一个基于分布式文件存储的开源数据库系统。 二、操作 MongoDB 1. 安装 pymongo python 使用第三方库来连接操作 MongoDB, 所以我们首先安…...

虹科案例 | 丝芙兰xDomo:全球美妆巨头商业智能新玩法

全球美妆行业的佼佼者丝芙兰,其走向成功绝非仅依靠品牌知名度和营销手段。身为数据驱动型企业,2018年以来,丝芙兰就率先在行业内采用虹科提供的Domo商业智能进行数据分析和决策,并首先享受了运营优化、效率提升所带来的商业价值。…...

10种优雅的MyBatis写法,同事用了都说好

用来循环容器的标签forEach,查看例子 foreach元素的属性主要有item,index,collection,open,separator,close。 item:集合中元素迭代时的别名, index:集合中元素迭代时的索引 open…...

SQL删除记录方式汇总

大家好,我是RecordLiu! 今天给大家分享的是SQL中删除记录的不同方式,我会用几道真题来给大家讲解。 题目直达链接: 牛客网在线SQL编程练习 切换到SQL篇就能看到了。 我这里先列下知识点: SQL中进行简单删除的语法是什么?SQL…...

用in函数嵌入子查询作为条件时查出结果为空

用in函数嵌入子查询作为条件时查出结果为空 问题: SELECT * FROM SGGCDB_VIEW sv WHERE RES_ID IN (SELECT urrv.RES_ID FROM IBPS_ERP.USER_ROLE_RES_VIEW urrv WHERE urrv.ID_ 1069978138403930112 )结果未空值。 原因: 首先,SELECT u…...

电商行业如何利用飞项解决跨部门协作难题

在电商行业中,跨部门合作是最常见的事。从产品方案到设计方案,从市场定价到销售策略,从采购需求到成本清单……在电商新品研发到正式售卖的过程中,存在着大量跨部门协作与逆向流程,但任务零碎、沟通难、进度难同步、文…...

全网最详细,Jmeter性能测试-性能基础详解,参数化函数取值(二)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 参数化详解 Jmeter中…...

选择排序的简单理解

详细描述 选择排序的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾&#xf…...

使用js封装一个循环链表

直接不说废话,直接上代码,这里继承了单向链表的类LinkList ,可以查看之前的文章,点这里 class Node {constructor(element) {this.element element;this.next null;} }class CirularLinkedList extends LinkList {constructor(…...

NumPy 秘籍中文第二版:二、高级索引和数组概念

原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们将介绍以下秘籍: 安装 SciPy安装 PIL调整图像大小比较视图和副本翻转 Lena花式索引位置列表索引布尔值索引数独的步幅技巧广播数…...

新品-图灵超频工作站GT430M介绍

曾经历史 UltraLAB GTxxxM系列是西安坤隆公司专注于超频高速计算应用的图形工作站。 2008年 获取排名第一、二的中国象棋软件均采用该机型。 2019年 推出采用Intel 超频Xeon(28核4.8GHz)显著提升电磁仿真频域算法求解、第一个解决8K视频解码与渲染。 今…...

js时间格式化精确到毫秒

/*** 数字前置补零* param value 值* param length 位数* returns {string}*/ export function digit(value, length 2) {if (typeof value "undefined" ||value null ||String(value).length > length) {return value;}return (Array(length).join("0&qu…...

QT样式表详解

本文详细介绍qt的样式表,包含样式表如何使用,常见语句和选择器。 背景说明 样式表用于设置外观,他是设置控件外观的方式之一。其他方式如下: 控件的成员函数,如QWidget::setBackground样式表调色板 优先级依次提高…...

最值得入手的好物有哪些,推荐几款实用的数码好物

随着科技的进步,越来越多的数码产品不断的出现在我们的生活中,这其中也不乏一些实用的数码产品,让我们可以享受更舒适的生活,提高我们的工作效率。下面就给大家分享几款我最近使用过的一些数码产品,它们不仅功能强大而…...

【20230407】NVIDIA显卡算力、Jetson比较

1 基本概念 1.1 算力单位 TOPS:指的是每秒钟可以执行的整数运算次数,它代表着计算机在处理图像、音频等任务时的处理能力。TOPS的单位是万亿次每秒(trillion operations per second)。一般是指整数运算能力INT8。 TFLOPS&#…...

dsl语法

查询 1.查询所有(默认有分页查询) #查询所有 GET /hotel/_search {"query": {"match_all": {}} } 2.match查询(条件查询)-----包含四川和外滩的信息,信息匹配度越高越靠前,两者存在一…...

不让CPU偷懒

文章资料摘自——《程序员的自我修养》 为了防止cpu执行完该程序后需要等待程序员手动加入下一个程序,才可以继续运行,这里大大浪费了cpu的效率,要知道cpu是十分昂贵的。 多道程序 在计算机发展的早期,CPU使用十分不方便&#x…...

动力节点王鹤SpringBoot3笔记——第七章 视图技术Thymeleaf

目录 第七章 视图技术Thymeleaf 前言 7.1 表达式 7.2 if-for 第七章 视图技术Thymeleaf 前言 Thymeleaf 是一个表现层的模板引擎, 一般被使用在 Web 环境中,它可以处理 HTML, XML、 JS 等文档,简单来说,它可以将 JSP 作…...

从比特保存和信息保存看数字资源长期保存

引用IBM以色列海法实验室的观点,数字资源长期保存包含两个层面含义,即比特保存与信息保存。也就是说,要实现数字资源的长期保存,必须同时做到比特保存和信息保存。 一 ​概念 01 比特保存,也叫物理保存,主…...

兰伯特光照模型(Lambert Lighting)和半兰伯特光照模型(Half-Lanbert)

关于漫反射 光打到凹凸不平的平面上,光线会被反射到四面八方,被称为漫反射 关于这种模型,由于光线由于分散,所以进入人眼的光线强度和观察角度没有区别 在A点和B点接收到的光线强度是一样的 在漫反射下,光线强度只和光…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

Kafka主题运维全指南:从基础配置到故障处理

#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​:下载安装 ​​De…...