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.rhkb.cn/news/80655.html

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

相关文章

开源代码分享(12)—考虑负荷曲线的配电网扩展规划(附matlab代码)

1.背景介绍 电力系统(SEP)不断扩展,以满足电力消费者的需求。在这个背景下,配电系统扩展规划(PESD)确定了配电网络扩展的指导方针。除了SEP的扩展之外,现代化和新技术的出现,例如分布…

Babylon.js开发工具链大全

本文介绍Babylon 团队(JS 和原生)和社区共同创建的所有出色工具的摘要,以帮助开发人员和设计人员创建出色的 3D 体验。 推荐:用 NSDT设计器 快速搭建可编程3D场景。 1、Sandbox 第一个工具Sandbox可能是最简单的,它实…

接口测试—知识速查(Postman)

文章目录 接口测试1. 概念2. 原理3. 测试流程4. HTTP协议4.1 URL的介绍4.2 HTTP请求4.2.1 请求行4.2.2 请求头4.2.3 请求体4.2.4 完整的HTTP请求示例 4.3 HTTP响应4.3.1 状态行4.3.2 响应头4.3.3 响应体4.3.4 完整的HTTP请求示例 5. RESTful接口规范6. 测试用例的设计思路6.1 单…

uniapp 微信小程序 分包

1、manifest.json内添加如图所示: "optimization" : {"subPackages" : true },2、在与pages同级上创建各个分包的文件夹 把需要分包的文件对应移入分包文件夹内 3、page.json内修改分包文件的路径 比如: {"path" : &qu…

微信云托管(本地调试)⑥:nginx、vue刷新404问题

一、nginx默认路径 1.1、默认配置文件路径:/etc/nginx/nginx.conf 1.2、默认资源路径:/usr/share/nginx/html/index.html 二、修改nginx.conf配置 (注意配置中的:include /etc/nginx/conf.d/*.conf; 里面包了一个server配置文件…

Unity制作护盾——1、闪电护盾

Unity引擎制作闪电护盾效果 大家好,我是阿赵。   这期做一个闪电护盾的效果。 一、效果说明 可以改变闪电的颜色 可以改变范围 改变贴图的平铺次数,也可以做出各种不同感觉的护盾。 二、原理 这个效果看着很复杂,其实只是用了一张N…

【excel密码】excel数据加密,如何设置?

Excel数据完成制作之后,想要保护工作表数据不被修改,我们可以对excel数据设置保护,确保数据的准确性。今天分享两种方法设置数据保护。 方法一:工作表/工作簿保护 这里的限制编辑被分为了两种方式,分别是保护工作表、…

Rpc原理

dubbo原理 1、RPC原理 一次完整的RPC调用流程(同步调用,异步另说)如下: 1)服务消费方(client)调用以本地调用方式调用服务; 2)client stub接收到调用后负责将方法、参数…

【快应用】list组件属性的运用指导

【关键词】 list、瀑布流、刷新、页面布局 【问题背景】 1、 页面部分内容需要瀑布流格式展示,在使用lsit列表组件设置columns进行多列渲染时,此时在里面加入刷新动画时,动画只占了list组件的一列,并没有完全占据一行宽度&…

科技感响应式管理系统后台登录页ui设计html模板

做了一个科技感的后台管理系统登录页设计,并且尝试用响应式布局把前端html写了出来,发现并没有现象中的那么容易,chrome等标准浏览器都显示的挺好,但IE11下面却出现了很多错位,兼容起来还是挺费劲的,真心不…

Linux下QtCreator勾选Use root user后出现error while loading shared libraries的问题

文章目录 背景解决办法其他解决办法 背景 在linux下调试程序时,有时候需要取得root权限才能连接操作某些设备。 之前我是通过脚本方式 [在QtCreator中先执行自定义命令再执行程序]来进行的。也就是在脚本中取得权限,脚本内容类似这样: echo…

如何维护你的电脑:打造IT人的重要武器

文章目录 方向一:介绍我的电脑方向二:介绍我的日常维护措施1. 定期清理和优化2. 保持良好的上网习惯和安全防护3. 合理安排软件和硬件的使用4. 数据备份和系统还原 方向三:推荐的维护技巧1. 数据分区和多系统安装2. 内部清洁和散热优化3. 安全…

鉴源论坛·观擎丨浅谈操作系统的适航符合性(下)

作者 | 蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 在浅谈操作系统的适航符合性(上)中,详细介绍了民用飞机操作系统的研制现状及其适航要求&#xff…

服装行业多模态算法个性化产品定制方案 | 京东云技术团队

一、项目背景 AI赋能服装设计师,设计好看、好穿、好卖的服装 传统服装行业痛点 • 设计师无法准确捕捉市场趋势,抓住中国潮流 • 上新周期长,高库存滞销风险大 • 基本款居多,难以满足消费者个性化需求 解决方案 • GPT数据…

RunnerGo配置场景时接口模式该怎么选

在进行性能测试时,测试场景的正确配置非常关键。首先,需要根据业务场景和需求,设计出合理的测试场景,再利用相应的工具进行配置,实现自动化的性能测试。 在JMeter中,用户需要自己组织测试场景,…

加拿大量子研究新动作!D-Wave与滑铁卢大学合作研究量子相干性

​ (图片来源:网络) D-Wave是量子计算系统、软件和服务的领导者,也是量子计算机的第一家供应商。近期,D-Wave宣布与滑铁卢大学量子计算研究所(IQC)达成两项新合作。他们为量子计算系统建立了关键…

Redis性能瓶颈揭秘:如何优化大key问题?

1. 什么是Redis大key问题 Redis大key问题指的是某个key对应的value值所占的内存空间比较大,导致Redis的性能下降、内存不足、数据不均衡以及主从同步延迟等问题。 到底多大的数据量才算是大key? 没有固定的判别标准,通常认为字符串类型的k…

服务器中了malox勒索病毒后怎么办怎么解决,malox勒索病毒解密数据恢复

服务器遭受Malox勒索病毒攻击后,快速解密并恢复数据至关重要,以便减少更大的经济损失。近期,新的一波malox勒索病毒正在肆虐,我们收到很多企业的求助,企业的服务器数据库遭到了malox勒索病毒攻击,导致系统内…

Vue常见的事件修饰符

1.prevent:阻止默认事件(常用) 2. stop:阻止事件冒泡(常用) 3. once:事件只触发一次(常用) 4.captrue:使用事件的捕捉模式(不常用) 5.self:只有event.target是当前操作的元素时才触发事件(不常用) 6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕(不常用…

CI/CD持续集成持续发布(jenkins)

1.背景 在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试; 或者前后端分离后,经常会修改接口,然后重新…