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

news2024/10/2 22:22:24

 阿丹:

        之前研究了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.coloradmin.cn/o/836162.html

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

相关文章

无涯教程-Perl - 面向对象

Perl中的面向对象概念很大程度上基于引用以及匿名数组和哈希。让我们开始学习面向对象Perl的基本概念。 定义类 在Perl中定义一个类非常简单。类以最简单的形式对应于Perl软件包。要在Perl中创建一个类,我们首先构建一个包。 Perl软件包在Perl程序中提供了一个单…

Java-day05(面向对象-1)

面向对象 面向对象与面向过程的区别: 面向过程,强调功能行为;面向对象,强调功能的对象。 Java类及类成员 类:对一类事物描述,是抽象的,概念上的定义对象:实际存在的该类事物的每…

(自控原理)线性系统的频域分析法

目录 一、频率特性 1、频率特性的基本概念 2、频率特性的几何表示方法 二、典型环节与开环系统的频率特性 1、典型环节 2、开环对数的频率特性曲线 三、稳定裕度 1、相角裕度 2、幅值裕度 一、频率特性 1、频率特性的基本概念 2、频率特性的几何表示方法 二、典型环节…

<van-empty description=““ /> 滚动条bug

使用 <van-empty description"" /> 时&#xff0c;图片出现了个滚动条&#xff0c;图片可以上下滑动。 代码如下&#xff1a; <block wx:if"{{courseList.length < 0}}"><van-empty description"" /> </block> <…

跨境电商怎么做?Live Market教你创业及做大生意

随着全球化的不断深入和互联网技术的迅猛发展&#xff0c;跨境电商成为了一个蓬勃发展的行业。根据eMarketer的数据&#xff0c;2021年全球跨境电商销售额将达到4.5万亿美元&#xff0c;预计到2025年将增长至6.3万亿美元。这表明&#xff0c;跨境电商行业将继续保持强劲增长的趋…

uni-app:分页实现多选功能

效果 代码解析 一、标签-列表 <view class"item_all" v-for"(item, index) in info" :key"index"><view class"position parameter-info text-over" :class"{checked_parameter: item.checked}" :data-id"i…

EditPlus取消自动.bak备份

Tools->Preferences->File 将√取消

Java正则校验密码至少包含:字母数字特殊符号中的2种

一、语法 字符说明\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c; n匹配字符 n。\n 匹配换行符。序列 \\\\ 匹配 \\ &#xff0c;\\( 匹配 (。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还会与"\n…

如何开发一个企业ERP系统

企业ERP系统是一种针对企业管理和运营的综合性管理软件&#xff0c;旨在提高企业的效率和生产力。随着信息化时代的发展&#xff0c;越来越多的企业意识到引入ERP系统的重要性。本文将详细介绍如何开发一个企业ERP系统&#xff0c;为读者提供丰富、详细的信息。 一、需求分析 …

基于SpringBoot+Vue的地方美食分享网站设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

SQL SERVER ROW_NUMBER、RANK、DENSE_RANK 分页应用

** ROW_NUMBER 、RANK、DENSE_RANK** ROW_NUMBER () over( order by 列) # 不论【列】是否存在重复&#xff0c; 序号都不会重复的&#xff0c;通常用唯一个标识的列 RANK() over(order by 列) # 列 存在重复&#xff0c; 则 顺序号一致&#xff0c; 两个人并列第一&#xff0c…

SpringBoot Plus+代码生产器

0目录 1. Mybatis Plus 2.代码生产器 1.Mybatis Plus 创建数据库和表&#xff08;id没有设置主键和自增长&#xff09; 创建springBoot导入依赖 安装lombok 配置yml 实体类加入注解 无参构造和有参构造 Mapper接口 扫描接口 测试 加入日志 添加 数据库…

Springboot 多数据源 dynamic-datasource动态添加移除数据源

0.前言 上一篇文章我们讲了如何通过多数据源组件&#xff0c;在Spring boot Druid 连接池项目中配置多数据源&#xff0c;并且通过DS注解的方式切换数据源&#xff0c;《Spring Boot 配置多数据源【最简单的方式】》。但是在多租户的业务场景中&#xff0c;我们通常需要手动的…

Python:Spider爬虫工程化入门到进阶(2)使用Spider Admin Pro管理scrapy爬虫项目

Python&#xff1a;Spider爬虫工程化入门到进阶系列: Python&#xff1a;Spider爬虫工程化入门到进阶&#xff08;1&#xff09;创建Scrapy爬虫项目Python&#xff1a;Spider爬虫工程化入门到进阶&#xff08;2&#xff09;使用Spider Admin Pro管理scrapy爬虫项目 目录 1、使…

排序算法(九大)- C++实现

目录 基数排序 快速排序 Hoare版本&#xff08;单趟&#xff09; 快速排序优化 三数取中 小区间优化 挖坑法&#xff08;单趟&#xff09; 前后指针法&#xff08;单趟&#xff09; 非递归实现&#xff08;快排&#xff09; 归并排序 非递归实现&#xff08;归并&am…

小程序https域名校验文件放在根目录

1. 下载校验文件 微信公众号平台 - 开发管理 - 开发设置 - 业务域名 2. 将校验文件放在服务器nginx - html 目录下 3. 修改nginx.conf 我这里配置的https主要是用来转发后台接口路径的 4. 验证 https://域名/校验文件名.txt&#xff0c;有返回即配置成功

OpenMesh 网格数据读取写入

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 通常,网格读取器和写入器例程是直接根据它们支持的数据结构和各自的文件格式编写的。这种方法的主要缺点是针对不同的数据结构或添加另一种文件格式会导致代码重复。因此OpenMesh提供了另一种做法,添加一个中间者…

java序列化框架全集讲解

一、简介 Java序列化框架是一种用于在Java应用程序中将对象转换为字节流或从字节流反序列化为对象的工具。序列化是将对象的状态转换为字节流的过程&#xff0c;以便可以将其存储在文件中、通过网络传输或在不同的系统之间共享。反序列化是将字节流转换回对象的过程。 Java序列…

【JS】前端编程8个小技巧(一)

文章目录 1.判断两个数是不是符号相同函数书写运算结果 2.判断一个数n是不是2的整数次幂函数书写运算结果 3.倒序遍历简写函数书写运算结果 4.快速得到一个星级评分函数书写运算结果 5.在程序抛出异常时快速切换搜索引擎stackoverflow的人机验证界面函数书写示例检索结果stacko…

发现全新TNAS Mobile 3,畅享铁威马NAS的乐趣!

千呼万唤始出来&#xff0c;铁威马全新TNAS mobile 3.2.18正式上线啦&#xff01;新增超实用的功能&#xff0c;搭配全新的更合理美观的 UI。往下看&#xff0c;给大家带来全新的移动存储管理体验&#xff01; 注意事项 目前TNAS mobile 3.2.18仅限于在安卓手机上运行&#xf…