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

MongoDB自学笔记(四)

一、前文回顾

上一篇文章中我们学习了MongoDB中的更新方法,也学了一部分操作符。今天我们将学习最后一个操作“删除”。

二、删除

原始数据如下:
image.png

1、deleteOne

语法:db.collection.deleteOne(< query >,< options >)
具体参数参考官网:
db.collection.deleteOne()
该命令会删除满足条件的第一个数据。
示例:例如我们想删除item = journal的数据

db.inventory.deleteOne({"item":"journal"})

image.png

2、deleteMany

语法:db.collection.deleteMany(< query >,< options >)
用法和上面基本一样,有所不同的是 deleteMany会删除所有满足条件的数据,这里不再赘述。

3、小结
至此我们已经把MongoDB的增删改查的基础学习完了,接下来要学习的则是更进阶的部分。我们知道在大多数场景下,数据库的作用是查询数据,所有我们先学习查询的进阶内容。

三、查询进阶—索引(初步介绍)

1、什么是索引

与绝大多数数据库一样,MongoDB也有索引。索引是一种加速查询的数据结构,通常是由B树或者B+树。例如我们现在有一个100万个集合的文档,我们要查找出其中name = “hardy”的数据,如果我们并没有在该字段中添加索引,那么MongoDB默认会使用全表扫描的方式来查询,如下图

如果没有索引,那么MongoDB只能从第一个文档开始 挨个的比较数据是否匹配,在数据量小的时候比较快,但是随着数据量的增大很明显速度会越来越慢。那么该如何优化呢?此时我们可以很容易的想到加索引。
索引可以简单理解为一个字典,他记录了某个值以及该值对应的文档在哪里,知道了具体的位置,那么查询就会变的相当迅速。

B+树的层级通常不高,而且采用的是二分查找法。可以很大程度上减少查询的次数,当找到对应索引之后,索引上会记录文档的ID,此时通过文档的ID再去查询文档,效率就会大大提供。

2、怎么创建索引

语法:db.collection.createIndex( < keys >, < options >, < commitQuorum >)
完整介绍
db.collection.createIndex()
示例:比如我要给集合inventory中的item字段添加索引

db.inventory.createIndex({"item": 1},{unique: true,name: "itemIndex"}
)这里的1表示升序,unique表示当前索引是唯一索引不能重复,而name是索引的名称

运行结果:
image.png
从结果中可以看出,之前存在一个索引,现在存在两个索引。那么问题来了,为什么一开始就存在一个索引呢?这个其实也很好理解,Mongo默认会给每个文档添加一个唯一的ID当作主键,所以这个一开就存在的是主键索引。接下来我们看下结果是否和我们预期的一样。这里我们使用getIndexes命令

db.inventory.getIndexes()

结果如下
image.png

3、怎么查看查询是否用了索引

和MySQL一样,MongoDB中也有explain函数,用于查看数据库的执行计划。这里我们用这个命令来判断当前的查询是否用了索引。

3.1、查询没有索引的字段

这里我们以status字段为例,我们要查询status=A的数据

db.inventory.explain().find({"status":"A"})

部分结果如下
image.png
winningPlan表示实际使用的查询计划,从这里不难看出针对当前查询,MongoDB采用的是COLLSCAN,集合扫描(也可以理解为全表扫描),需要每一个文档挨个的比较。

3.2、查询含有索引的列
db.inventory.explain().find({"item":"mat"})

部分结果如下
image.png
可以看到实际执行的计划是采用IXSCAN也就是索引扫描,于此同时上面的stage还有一个FETCH,这里的FETCH 也就是MySQL中的回表。因为当前的索引只记录了索引值以及当前索引对应的文档ID,MongoDB拿到当前文档的ID后还需要通过ID再次去查一次文档。聪明的你可能会问了,那有没有不用FECTH的情况呢?很显然是有的,比如我们只查询item字段,此时就不需要再次回表。代码如下

db.inventory.explain().find({"id":"mat"},{"item":1})

image.png

当然你可以直接通过ID查询,也是不会回表的。至于为什么个放到后文讲

db.inventory.explain().find({"_id":"66951edbdf24000083007d75"})

结果如下
image.png

四、结束语

本文讲简单的讲述了一下删除文档操作,以及对索引展开了一定的讲解,当然索引的内容远不止此,后面还有更多的内容,希望对你有所帮助。

未完待续

相关文章:

MongoDB自学笔记(四)

一、前文回顾 上一篇文章中我们学习了MongoDB中的更新方法&#xff0c;也学了一部分操作符。今天我们将学习最后一个操作“删除”。 二、删除 原始数据如下&#xff1a; 1、deleteOne 语法&#xff1a;db.collection.deleteOne(< query >,< options >) 具体参…...

时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法(CPO)优化VMD二次分解

时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法&#xff08;CPO&#xff09;优化VMD二次分解 目录 时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法&#xff08;CPO&#xff09;优化VMD二次分解效果一览基本介绍程序设计参考资料 效果一览…...

新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题

苹果CMS2022新版海螺影视主题M3.1版本&#xff0c;这个主题我挺喜欢的&#xff0c;之前也有朋友给我提供过原版主题&#xff0c;一直想要破解但是后来找了几个SG11解密的大哥都表示解密需要大几百大洋&#xff0c;所以一直被搁置了。这个版本是完全解密的&#xff0c;无需SG11加…...

汽车免拆诊断案例 | 2014 款上汽名爵 GT 车发动机无法起动

故障现象 一辆2014款上汽名爵GT车&#xff0c;搭载15S4G发动机&#xff0c;累计行驶里程约为18.4万km。该车因左前部发生碰撞事故进厂维修&#xff0c;更换损坏的部件后起动发动机&#xff0c;起动机运转有力&#xff0c;但无着机迹象。用故障检测仪检测&#xff0c;发现无法与…...

vue3前端开发-小兔鲜项目-登录功能的业务接口调用

vue3前端开发-小兔鲜项目-登录功能的业务接口调用!这次&#xff0c;正式调用远程服务器的登录接口了。大家要必须使用测试账号密码&#xff0c;才能验证我们的代码。 测试账号密码是&#xff1a;账号&#xff08;xiaotuxian001&#xff09;&#xff1b;密码是&#xff08;1234…...

【Linux】vim编辑器使用详解

目录 一、vim编辑器简介二、 vim编辑器使用指南1.基本操作1.进入与退出2.模式切换 2.命令模式1.移动光标2.选择文本&#xff08;可视模式&#xff09;3.删除文字4.复制粘贴5.替换6.撤销7.注释8.多文件窗口切换 3.底行模式1.列出每行的行号2.跳转到某行3.查找字符4.保存文件5.在…...

手机怎么设置不同的ip地址

在数字化日益深入的今天&#xff0c;智能手机已成为我们生活、工作和学习中不可或缺的设备。然而&#xff0c;随着网络应用的广泛和深入&#xff0c;我们有时需要为手机设置不同的IP地址来满足特定需求。比如&#xff0c;避免网络限制、提高网络安全、或者进行网络测试等。本文…...

SpringBoot读取配置的6种方式

在SpringBoot应用开发中&#xff0c;配置文件是不可或缺的一部分。它们帮助我们管理应用的运行时参数&#xff0c;使得应用的部署和维护变得更加灵活。SpringBoot提供了多种方式来读取配置文件&#xff0c;每种方式都有其适用场景和优缺点。本文将介绍六种常用的SpringBoot读取…...

1.1 openCv -- 介绍

OpenCV(开放源代码计算机视觉库:http://opencv.org)是一个开源库,包含了数百种计算机视觉算法。本文件描述了所谓的OpenCV 2.x API,这是一个本质上基于C++的API,与基于C的OpenCV 1.x API(C API已被弃用,并且自从OpenCV 2.4版本起不再使用“C”编译器进行测试)相对。 …...

探索PostgreSQL的GUI工具:提升数据库管理效率

在当今快速发展的技术世界中&#xff0c;数据库管理是任何软件开发项目的核心部分。PostgreSQL&#xff0c;作为一款功能强大的开源关系型数据库管理系统&#xff0c;因其稳定性、可靠性和高度的可扩展性而广受开发者和数据库管理员的青睐。然而&#xff0c;尽管PostgreSQL自带…...

【从零开始实现stm32无刷电机FOC】【实践】【5/7 stm32 adc外设的高级用法】

目录 采样时刻触发采样同步采样 点击查看本文开源的完整FOC工程 本节介绍的adc外设高级用法用于电机电流控制。 从前面几节可知&#xff0c;电机力矩来自于转子的q轴受磁力&#xff0c;而磁场强度与电流成正比&#xff0c;也就是说电机力矩与q轴电流成正相关&#xff0c;控制了…...

springcloud接入seata管理分布式事务

下载安装包 链接: seata 配置seata-server 文件上传Linux解压 压缩包我放在/usr/local/seata中 tar -zxvf seata-server-2.0.0.tar.gz修改配置文件 设置nacos为注册和配置中心 进入文件夹 cd /usr/local/seata/seata/conf修改application.yml文件 ...... ...... cons…...

Android APP 音视频(02)MediaProjection录屏与MediaCodec编码

说明&#xff1a; 此MediaProjection 录屏和编码实操主要针对Android12.0系统。通过MediaProjection获取屏幕数据&#xff0c;将数据通过mediacodec编码输出H264码流&#xff08;使用ffmpeg播放&#xff09;&#xff0c;存储到sd卡上。 1 MediaProjection录屏与编码简介 这里…...

java中log4j.properties配置文件浅析

Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的&#xff0c;它可按keyvalue格式的设置或xml格式的设置信息。通过配置&#xff0c;可以创建出Log4J的运行环境。 1、配置文件 Log4J配置文件的基本格式如下&#xff1a; #配置根Logger log4j.roo…...

RV1126 Linux 系统,接外设,时好时坏(二)排查问题的常用命令

在 RV1126 Linux 系统中,排查外设连接问题时,可以使用多种命令来诊断和调试。以下是一些常用的命令和工具: 1. 查看系统日志 dmesg: 显示内核环形缓冲区的消息,通常包含设备初始化、驱动加载和错误等信息。 dmesg | grep <设备名或相关关键字>journalctl: 查看系统…...

鸿蒙北向开发 DevEco Studio 4.1 下载安装傻瓜式教程

开篇 由于鸿蒙处于快速发展中,鸿蒙的api快速迭代更新,老版本的DevEco studio无法支持更新版本的api,因此华为官网放弃了老版本的维护.直接从华为开发者官网无法下载老版本,当前华为开发者官网已经推出next版本了 DevEco studio3.1安装教程 上述教程提供的华为开发者官网地址已经…...

pglogical扩展的基本用法介绍

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;14 文档用途 本文翻译了pglogical扩展的官方文档,介绍了pglogical扩展的各类管理函数及使用限制,详情请看下文. 一、节点管理 节点可以使用以下…...

2024年虚拟主机转移教程

转移网站并不困难&#xff0c;但选择正确的选项和最佳程序才是关键。网站托管服务被视为当今数字世界的基石&#xff0c;全球有18 亿个网站。网站所有者可以通过下载备份、将其上传到新服务器并指向域名来手动转移网站。他们还可以通过新网站托管商的助手请求来移动网站。对于初…...

Python 函数对象和函数调用

Python 函数对象和函数调用 在 Python 中&#xff0c;函数是第一类对象&#xff08;first-class objects&#xff09;。这意味着函数可以像其他对象&#xff08;如整数、字符串、列表等&#xff09;一样被传递、赋值和操作。理解函数对象和函数调用的区别是学习 Python 的关键…...

sql注入的专项练习 sqlilabs(含代码审计)

在做题之前先复习了数据库的增删改查&#xff0c;然后自己用本地的环境&#xff0c;在自己建的库里面进行了sql语句的测试&#xff0c;主要是回顾了一下sql注入联合注入查询的语句和sql注入的一般做题步骤。 1.获取当前数据库 2.获取数据库中的表 3.获取表中的字段名 一、sql…...

Fish-Speech-1.5开源模型的企业级部署架构设计

Fish-Speech-1.5开源模型的企业级部署架构设计 如果你正在考虑将Fish-Speech-1.5这个强大的语音合成模型引入到自己的业务中&#xff0c;比如做个智能客服、有声书平台&#xff0c;或者给产品加个语音播报功能&#xff0c;那你肯定不能只满足于在本地电脑上跑个Demo。一旦涉及…...

从漏极、栅极到源极开关:手把手教你选对单端电荷泵拓扑(基于噪声与速度权衡)

从漏极、栅极到源极开关&#xff1a;单端电荷泵拓扑的噪声与速度权衡实战指南 在锁相环(PLL)设计中&#xff0c;电荷泵的性能往往成为整个系统相位噪声和杂散特性的瓶颈。特别是当设计目标同时包含低带内相位噪声和高开关速度时&#xff0c;单端电荷泵的拓扑选择就变得尤为关键…...

NaViL-9B一文详解:双GPU显存占用分析、服务重启与端口验证

NaViL-9B一文详解&#xff1a;双GPU显存占用分析、服务重启与端口验证 1. 平台概述 NaViL-9B是由专业研究机构开发的原生多模态大语言模型&#xff0c;具备文本问答和图片理解双重能力。该模型在设计上充分考虑了工程落地需求&#xff0c;特别针对双GPU环境进行了优化适配。 …...

OneMore插件:提升OneNote效率的160+实用功能全解析

OneMore插件&#xff1a;提升OneNote效率的160实用功能全解析 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 作为一名科研工作者&#xff0c;李明每天需要处理数十页…...

基于关键链方法的遗传算法求解项目调度问题

一、问题背景与核心思想 项目调度问题&#xff08;Project Scheduling Problem, PSP&#xff09;是在满足活动逻辑关系&#xff08;紧前约束&#xff09;和资源约束&#xff08;如人力、设备&#xff09;的前提下&#xff0c;确定各活动开始/结束时间&#xff0c;以最小化项目工…...

从零到一实战:基于快马平台快速开发企业级jiyutrainer在线评测系统

今天想和大家分享一个很实用的开发经验——如何快速搭建一个企业级的在线编程评测系统。最近正好有个朋友想做一个类似jiyutrainer的编程练习平台&#xff0c;我就用InsCode(快马)平台试了试&#xff0c;效果出乎意料的好。 项目需求分析 首先明确我们需要实现的核心功能&#…...

新手避坑指南:用MATLAB复现TI IWR1443雷达的距离与速度FFT处理(附完整代码)

新手避坑指南&#xff1a;用MATLAB复现TI IWR1443雷达的距离与速度FFT处理&#xff08;附完整代码&#xff09; 第一次拿到IWR1443毫米波雷达开发板时&#xff0c;看着官方文档里密密麻麻的英文术语和零散的代码片段&#xff0c;我对着电脑屏幕发呆了整整半小时。作为电子工程专…...

告别树莓派原生系统:我在SpotMicro上成功部署ROS Kinetic的完整踩坑记录

从树莓派到ROS Kinetic&#xff1a;SpotMicro四足机器人深度改造实战 当树莓派原生系统在SpotMicro项目上反复报错时&#xff0c;我盯着纹丝不动的前腿舵机&#xff0c;意识到是时候转向更专业的ROS方案了。这不是简单的系统切换&#xff0c;而是一次从底层架构到控制逻辑的全面…...

如何用PPI网络community分析发现潜在药物靶点?微生信可视化保姆教程

从PPI网络到药物靶点&#xff1a;基于Community分析的生物标记物发现全流程 在生物医学研究的浩瀚海洋中&#xff0c;蛋白质-蛋白质相互作用(PPI)网络犹如一张精密的城市交通图&#xff0c;而community分析则帮助我们识别出其中的"功能街区"。想象一下&#xff0c;当…...

保姆级教程:NLI-DistilRoBERTa快速部署与简单调用指南

保姆级教程&#xff1a;NLI-DistilRoBERTa快速部署与简单调用指南 1. 项目概述与核心能力 NLI-DistilRoBERTa是基于DistilRoBERTa模型的自然语言推理(Natural Language Inference)Web服务&#xff0c;专门用于分析两个句子之间的逻辑关系。这个轻量级模型保留了RoBERTa模型90…...