MongoDB文档-进阶使用-MongoDB索引-createindex()与dropindex()-在MongoDB中使用正则表达式来查找

 阿丹:

        之前研究了MongoDB的基础增删改查。在学会基础的数据库增删改查肯定是不够的。这个时候就涉及到了数据库搜索的时候的效率。需要提高数据的搜索效率。

MongoDB索引

        在所以数据库中如果没有数据索引的时候。如果需要查找到一些数据。都会去主动扫描所有可能存在的集合。引入了索引概念就能很高效的使用索引来限制必须在集合中去搜索的文档数。

        索引的概念:

        索引是特殊数据集,用于存储集合数据的一部分。由于数据是部分数据。因此读取该数据变得更加容易。此部分集存储特定字段的值或按字段值排序的一组字段。

对索引的影响:

  • 如何创建索引:createIndex()
  • 如何查找索引:getindexes()
  • 如何删除索引:dropindex()

索引的影响

        从上面的介绍可以看到固然索引对于数据库很友好对于性能的提升也很友好,但是索引太多会减少其他操作。例如插入删除以及其他更新操作。反而得不偿失。

        如果语句文档进行频繁的删除等更新操作,如果对于索引的这些字段也进行了影响。那么就需要对这些索引也进行更正改正。

        也就是说本对于查询来说是很友好的,但是如果涉及到了索引字段的值修改就要修改MongoDB的两个内容阶段。

        所以在索引的选择上要选择不经常更新的字段以及相对重要的字段来作为索引。

 

如上图所示;

        id与code为不经常变更的数据字段所以将这两个字段可以设置为索引。方便我们进行搜索。

如何创建索引:createIndex()

在MongoDB中通过createindex的方法来创建

我先使用如下语句来进行创建了一个ExampleDB集合,然后将3个文档存放到了这个集合中去。

var Example = [{"_id":2,"adncode":1,"员工姓名":"帅丹"},{"_id":3,"adncode":2,"员工姓名":"大力丹"},{"_id":4,"adncode":1,"员工姓名":"库库丹"}
]
db.ExampleDB.insert(Example)

 在这个文档的格式中我们就可以使用“_id”和“adncode”作为索引。

那么我们接下来使用createindex方法创建索引

#创建索引
db.ExampleDB.createIndex({adncode:1})

代码解释:

       这个语句是用于在ExampleDB数据库中创建一个索引,索引的名称是adncode,索引的列是第一列。

        具体来说,db.ExampleDB.createIndex({adncode:1}) 是对名为ExampleDB的数据库中的adncode列创建索引,其中adncode是索引的名称,1表示该列是第一列。通过创建索引,可以提高查询adncode列的数据的效率。

        参数“ 1”表示使用“ adncode”字段值创建索引时,应按升序对其进行排序。请注意,这与_id字段(ID字段用于唯一标识集合中的每个文档)不同,后者由MongoDB在集合中自动创建。现在,将按照adncode而不是_id字段对文档进行排序。

        参数为1表示升序排序,而参数为-1表示倒序排序。在MongoDB中,索引的方向可以是单向(1或-1)或双向({-1,1}或{1,-1}),分别表示从左到右或从右到左的顺序。在创建索引时,可以根据实际需求选择适当的的方向和列来创建索引,以提供更快速的文件访问和查询性能。总之,索引的方向和参数可以根据具体的需求进行选择和调整,以实现最佳的性能和查询效果。

 创建成功返回语句解释:

  1. numIndexesBefore:1表示运行命令之前索引中存在的字段值(集合中的实际字段)的数量。请记住,每个集合都有_id字段,该字段也算作索引的Field值。由于_id索引字段在最初创建时是集合的一部分,因此numIndexesBefore的值为1。
  2. numIndexesAfter:2表示运行命令后索引中存在的字段值的数目。
  3. 此处的“ ok:1”输出指定操作已成功,并且新索引已添加到集合中。

上面的代码显示了如何基于一个字段值创建索引,但是也可以基于多个字段值创建索引。

 创建索引语句参数讲解

db.ExampleDB.createIndex(keys, options)是MongoDB中用于创建索引的语句。其中的keys参数指定要创建索引的键,可以是一个键文档(如{adncode: 1})或一个包含多个键的数组(如[adncode, code2])。options参数用于指定索引的选项和行为,它是一个包含多个选项的文档。

以下是一些常用的选项和它们的作用:

  1. background:指定索引是否在后台创建,这样可以在创建索引时继续其他操作。默认情况下,索引是在前台创建的,这意味着其他操作会被阻塞。
  2. unique:指定索引是否是唯一的。如果设置为true,则在文档中不允许出现重复的索引键值。
  3. dropDups:在创建索引时是否删除重复的文档。如果设置为true,则在创建索引时将删除所有重复的文档。
  4. name:索引的名称,用于标识和引用该索引。
  5. expireAfterSeconds:指定文档过期的时间,以秒为单位。如果设置为一个正数,则在该时间后,文档将被删除。

在使用这个语句时,基本的语法是:

db.collection.createIndex(keys, options)

其中,keys参数可以根据需要设置为一个键文档或一个包含多个键的数组。options参数是可选的,可以根据需要设置为一个包含选项的文档。

需要注意的是,在创建索引时,应该根据实际需求和性能要求选择合适的类型和参数。索引的创建会增加存储空间和计算开销,并且在修改文档时也会受到影响。因此,应该仔细评估索引的需求和影响,并选择适当的的选择和参数。

一次性创建多个字段索引

db.Employee.createIndex({Employeeid:1, EmployeeName:1])

代码解释:

        现在,createIndex方法考虑多个字段值,这些值现在将导致根据“ Employeeid”和“ EmployeeName”创建索引。Employeeid:1和EmployeeName:1指示应在这2个字段值上创建索引,而:1则指示索引应按升序排列。

如何查找索引:使用getindexes()方法

#查找索引
db.ExampleDB.getIndexes()

 代码解释:

  1. getIndexes方法用于查找集合中的所有索引。
  2. 输出返回一个文档,该文档仅显示集合中有2个索引,即_id字段,另一个是Employee id字段。:1表示索引中的字段值是按升序创建的。

如何删除索引:dropindex()

通过使用dropindex方法在MongoDB中删除索引


#删除索引
db.ExampleDB.dropIndex({adncode:1})

代码解释:

  1. dropIndex方法采用必需的字段值,该值需要从索引中删除。
  2. 返回结果值nIndexesWas:2表示在运行命令之前索引中存在的字段值的数目。请记住,每个集合都有_id字段,该字段也算作索引的Field值。
  3. ok:1输出指定该操作成功,并且从索引中删除了“ adncode”字段。
  4. 要一次删除集合中的所有索引,可以使用dropIndexes命令。

删除所有索引

db.ExampleDB.dropIndexes()

代码解释

  1. dropIndexes方法将删除除_id索引以外的所有索引。

小总结:

  • 定义索引对于快速高效地搜索集合中的文档非常重要。
  • 可以使用createIndex方法创建索引。可以仅在一个字段或多个字段值上创建索引。
  • 可以使用getIndexes方法找到索引。
  • 可以通过将dropIndex用于单个索引或将dropIndex用于删除所有索引来删除索引。

在MongoDB中使用正则表达式(Regex)-爬虫可用

正则表达式基本概念:

        正则表达式用于模式匹配,基本上用于在文档中发现和匹配字符串,以及一些校验规则。

通过正则表达式可以帮助我们在文档中快速的找到和定位到相应的字符串。

使用$regex运算符进行模式匹配

MongoDB中的regex运算符用于在集合中搜索特定的字符串。

比如在上面我们向目标集合中添加的文档们,我现在想要查询有“丹”字出现的文档。我就可以使用正则表达式类指定搜索条件。

#使用正则表达式来制定搜索条件
db.ExampleDB.find({员工姓名 : {$regex : "丹"}}
).forEach(printjson)

 代码解释:

        在这里,查找了所有带“丹”字符的员工姓名。因此使用$ regex运算符来定义“ 丹”的搜索条件,也能从结果看到返回了包含对应汉字的文档。

使用正则表达式中的语法对查询规则进行精准描述

规则“^”

比如我们可以使用在匹配规则字符串前添加“^”来保证匹配的时候前面是没有字符的。

可从结果看到“^”符号的作用就是规定在查找的时候关键字前面不能有其他字符。

 规则“$”

还可以使用$符号规则来规定在匹配字符的后面不允许有其他字符

 从两次的结果可以看到在加上$符号后,在关键字后面如果有字符就不在参与搜索了。

其他规则

字符匹配

元字符 . 可以匹配除换行符之外的任何字符。

例如:. " 可以匹配任何字符串,包括空字符串。

字符集合

用花括号 [] 表示一个字符集合,可以匹配其中任意一个字符。

例如:[abc] 可以匹配字符 ab 或 c

字符范围

用连字符 - 表示字符范围,可以匹配一定范围内的字符。

例如:[a-z] 可以匹配小写字母。

否定字符集合

用花括号 [^] 表示一个否定字符集合,可以匹配除了其中指定的字符之外的任何字符。

例如:[^abc] 可以匹配除了字符 ab 或 c 之外的任何字符。

量词

量词用于匹配前面的元素出现的次数。常见的量词包括:

  • * 表示前面的元素可以出现 0 次或多次。
  • + 表示前面的元素可以出现 1 次或多次。
  • ? 表示前面的元素可以出现 0 次或 1 次。
  • {n} 表示前面的元素出现 n 次。
  • {n,} 表示前面的元素至少出现 n 次。
  • {n,m} 表示前面的元素至少出现 n 次,但不超过 m 次。

例如:a* 可以匹配 0 个或多个字母 a

转义字符

在正则表达式中,一些特殊字符需要使用反斜杠 \ 进行转义,例如 \d 表示数字、\s 表示空白字符等。

例如:\d+ 可以匹配一个或多个数字。

与$ options进行模式匹配

使用正则表达式运算符时,还可以使用$ options关键字提供其他选项。假设我们想查找所有在目标集合中中带有英文字符的文档,而不管它是区分大小写还是不区分大小写。如果需要这样的结果,那么我们需要使用不区分大小写参数的$ options

现在,我们运行与上一个相同的查询,我们将永远不会在结果中看到带有大写的英文的文档。为了确保将其包含在结果集中,我们需要添加$ options“ I”参数。

db.Employee.find({EmployeeName:{$regex: “Gu”,$options:’i’}}).forEach(printjson)

代码解释:

1、带“ I”参数(表示不区分大小写)的$ options指定无论我们发现字母是小写还是大写,我们都希望执行搜索

2、结果表明,即使一个文档具有大写的目标字母,该文档仍会显示在结果集中

没有regex运算符的模式匹配

 在这里没有使用regex运算符,也可以正常使用正则表达式匹配操作

#使用正则表达式来制定搜索条件
db.ExampleDB.find({员工姓名 :  /库库丹/}
).forEach(printjson)

说明:

        “//”在MongoDB中这个选项就说明在这些定界符中指定了搜索的条件。

具体正则表达式如何书写可以根据上面提供过的文档来书写。

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

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

相关文章

mybatis-plus的逻辑删除的坑

一旦在逻辑字段上加了TableLogic逻辑删除的配置,并且使用mybatis-plus自带的方法时(如果自己用xml写SQL不会出现下面的情况) 查询、修改时会自动排除逻辑删除的数据 当使用mybatis-plus自带的查询方法时,就不用每次查询的时候跟…

Blazor 简单组件(1):B_Icon开发

文章目录 前言ICON开发使用 前言 Blazor 简单组件(0)&#xff1a;简单介绍 ICON开发 <i class"Type" style"font-size:(Size)px;color:Color;"></i>code {/// <summary>/// icon类型/// </summary>[Parameter]public string Typ…

nginx 以及nginx优化

目录 nginx功能介绍 静态文件服务 反向代理 动态内容处理 SSL/TLS 加密支持 虚拟主机支持 URL 重写和重定向 缓存机制 日志记录 可扩展性和灵活性 nginx的主要应用场景 nginx常用命令 nginx另外一种安装方式 nginx常用的信号符&#xff1a; nginx配置文件详解 n…

Nginx复现

docker复现Nginx配置漏洞 2.1CRLF(carriage return/line feed)注入漏洞 这个漏洞产生的原因是请求重定向的错误配置&#xff0c;导致在url中输入回车换行符可以控制http响应头部 比如&#xff1a;location / { return 302 https://$host$uri; } 原本的目的是为了让http的…

【JavaEE基础学习打卡02】是时候了解JavaEE了

目录 前言一、为什么要学习JavaEE二、JavaEE规范介绍1.什么是规范&#xff1f;2.什么是JavaEE规范&#xff1f;3.JavaEE版本 三、JavaEE应用程序模型1.模型前置说明2.模型具体说明 总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学者、爱好者&#xff0c;小白白。我们的天…

c#在设计时调试自定义 Windows 窗体控件

private string demoStringValue null; [Browsable(true)] public string DemoString {get{return this.demoStringValue;}set{demoStringValue value;} } 参考链接 在设计时调试自定义控件 - Windows Forms .NET Framework | Microsoft Learnhttps://learn.microsoft.com/z…

生信豆芽菜——配对型的复杂箱线图使用说明

网站&#xff1a;http://www.sxdyc.com/visualsBoxHalfPlot 一、配对型的复杂箱线图简介 配对型的复杂箱线图原理与箱线图相同&#xff0c;常见于配对样本的数据分析中&#xff0c;在日常研究中&#xff0c;我们会碰到配对资料&#xff0c;例如同一病人治疗前后的变化&#xff…

数据结构: 线性表(带头双向循环链表实现)

之前一章学习了单链表的相关操作, 但是单链表的限制却很多, 比如不能倒序扫描链表, 解决方法是在数据结构上附加一个域, 使它包含指向前一个单元的指针即可. 那么怎么定义数据结构呢? 首先我们先了解以下链表的分类 1. 链表的分类 链表的结构非常多样, 以下情况组合起来就有…

LVS集群

目录 1、lvs简介&#xff1a; 2、lvs架构图&#xff1a; 3、 lvs的工作模式&#xff1a; 1&#xff09; VS/NAT&#xff1a; 即&#xff08;Virtual Server via Network Address Translation&#xff09; 2&#xff09;VS/TUN &#xff1a;即&#xff08;Virtual Server v…

7.2 手撕VGG11模型 使用Fashion_mnist数据训练VGG

VGG首先引入块的思想将模型通用模板化 VGG模型的特点 与AlexNet&#xff0c;LeNet一样&#xff0c;VGG网络可以分为两部分&#xff0c;第一部分主要由卷积层和汇聚层组成&#xff0c;第二部分由全连接层组成。 VGG有5个卷积块&#xff0c;前两个块包含一个卷积层&#xff0c…

MySQL_SQL性能分析

SQL执行频次 语法&#xff1a; SHOW GLOBAL STATUS LIKE COM_类型; COM_insert; 插入次数 com_delete; 删除次数 com_update; 更新次数 com_select; 查询次数 com_______; 注意&#xff1a;通过语法&#xff0c;可以查询到数据库的实际状态&#xff0c;就可以知道数据库是以增删…

TDesign中后台管理系统-用户登录

目录 1 创建用户表2 开发后端接口3 测试接口4 修改登录页面调用后端接口最终效果总结 中后台系统第一个要实现的功能就是登录了&#xff0c;我们通常的逻辑是让用户在登录页面输入用户名和密码&#xff0c;调用后端接口去验证用户的合法性&#xff0c;然后根据接口返回的结果进…

【T3】金蝶kis凭证数据转换到畅捷通T3软件中。

【问题需求】 将金蝶软件中的账套转换到畅捷通T3软件中。 由于金蝶老版本使用的是非sql server数据库。 进而需要将其数据导入到sql中,在转换到T3。 【转换环境】 金蝶中数据:凭证;科目无项目核算。 1、金蝶的数据文件后缀为.AIS; 2、安装office2003全版软件; 3、安装sq…

【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字

盛水最多的容器 &#xff08;1&#xff09;暴力解法 算法思路&#xff1a;我们枚举出所有的容器大小&#xff0c;取最大值即可。 容器容积的计算方式&#xff1a; 设两指针 i , j &#xff0c;分别指向水槽板的最左端以及最右端&#xff0c;此时容器的宽度为 j - i 。由于容器…

【CDH集群】无法发出查询:Host Monitor未运行

无法发出查询:Host Monitor未运行 【CDH集群】无法发出查询:Host Monitor未运行同事的解决方案解决方法&#xff1a;删除原uuid重启agent查看新uuid修改scm数据库中HOSTS表中的agent的uuid 【CDH集群】无法发出查询:Host Monitor未运行 起初是impala报错&#xff0c;连接不上&…

使用 React Native CLI 创建项目

React Native 安装的先决条件和设置 需要掌握的知识点 掌握 JavaScript 基础知识掌握 React 相关基础知识掌握 TypeScript 相关基础知识 安装软件前需要首先安装Chocolatey。Chocolatey 是一种流行的 Windows 包管理器。 安装 nodejs 和 JDK choco install -y nodejs-lts …

【工作记录】mysql中实现分组统计的三种方式

前言 实际工作中对范围分组统计的需求还是相对普遍的&#xff0c;本文记录下在mysql中通过函数和sql完成分组统计的实现过程。 数据及期望 比如我们获取到了豆瓣电影top250&#xff0c;现在想知道各个分数段的电影总数. 表数据如下: 期望结果: 实现方案 主要思路是根据s…

解决Vue+Element-UI 进行From表单校验时出现了英文提示问题

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 问题描述 在使用form表单时&#xff0c;往往会对表单字段进行校验&#xff0c;字段为必填项时会添加required属性&#xff0c;此时自定义rules规则…

RabbitMQ 消息队列

文章目录 &#x1f370;有几个原因可以解释为什么要选择 RabbitMQ&#xff1a;&#x1f969;mq之间的对比&#x1f33d;RabbitMQ vs Apache Kafka&#x1f33d;RabbitMQ vs ActiveMQ&#x1f33d;RabbitMQ vs RocketMQ&#x1f33d;RabbitMQ vs Redis &#x1f969;linux docke…

MyBatis Plus-个人笔记

前言 学习视频 尚硅谷-Mybatis-Plus教程学习主要内容 本文章记录尚硅谷-Mybatis-Plus教程内容&#xff0c;只是作为自己学习笔记&#xff0c;如有侵扰请联系删除 一、MyBatis-Plus简介 1、简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#…