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}),分别表示从左到右或从右到左的顺序。在创建索引时,可以根据实际需求选择适当的的方向和列来创建索引,以提供更快速的文件访问和查询性能。总之,索引的方向和参数可以根据具体的需求进行选择和调整,以实现最佳的性能和查询效果。
创建成功返回语句解释:
- numIndexesBefore:1表示运行命令之前索引中存在的字段值(集合中的实际字段)的数量。请记住,每个集合都有_id字段,该字段也算作索引的Field值。由于_id索引字段在最初创建时是集合的一部分,因此numIndexesBefore的值为1。
- numIndexesAfter:2表示运行命令后索引中存在的字段值的数目。
- 此处的“ ok:1”输出指定操作已成功,并且新索引已添加到集合中。
上面的代码显示了如何基于一个字段值创建索引,但是也可以基于多个字段值创建索引。
创建索引语句参数讲解
db.ExampleDB.createIndex(keys, options)
是MongoDB中用于创建索引的语句。其中的keys
参数指定要创建索引的键,可以是一个键文档(如{adncode: 1}
)或一个包含多个键的数组(如[adncode, code2]
)。options
参数用于指定索引的选项和行为,它是一个包含多个选项的文档。
以下是一些常用的选项和它们的作用:
background
:指定索引是否在后台创建,这样可以在创建索引时继续其他操作。默认情况下,索引是在前台创建的,这意味着其他操作会被阻塞。unique
:指定索引是否是唯一的。如果设置为true,则在文档中不允许出现重复的索引键值。dropDups
:在创建索引时是否删除重复的文档。如果设置为true,则在创建索引时将删除所有重复的文档。name
:索引的名称,用于标识和引用该索引。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()
代码解释:
- getIndexes方法用于查找集合中的所有索引。
- 输出返回一个文档,该文档仅显示集合中有2个索引,即_id字段,另一个是Employee id字段。:1表示索引中的字段值是按升序创建的。
如何删除索引:dropindex()
通过使用dropindex方法在MongoDB中删除索引
#删除索引
db.ExampleDB.dropIndex({adncode:1})
代码解释:
- dropIndex方法采用必需的字段值,该值需要从索引中删除。
- 返回结果值nIndexesWas:2表示在运行命令之前索引中存在的字段值的数目。请记住,每个集合都有_id字段,该字段也算作索引的Field值。
- ok:1输出指定该操作成功,并且从索引中删除了“ adncode”字段。
-
要一次删除集合中的所有索引,可以使用dropIndexes命令。
删除所有索引
db.ExampleDB.dropIndexes()
代码解释
- dropIndexes方法将删除除_id索引以外的所有索引。
小总结:
- 定义索引对于快速高效地搜索集合中的文档非常重要。
- 可以使用createIndex方法创建索引。可以仅在一个字段或多个字段值上创建索引。
- 可以使用getIndexes方法找到索引。
- 可以通过将dropIndex用于单个索引或将dropIndex用于删除所有索引来删除索引。
在MongoDB中使用正则表达式(Regex)-爬虫可用
正则表达式基本概念:
正则表达式用于模式匹配,基本上用于在文档中发现和匹配字符串,以及一些校验规则。
通过正则表达式可以帮助我们在文档中快速的找到和定位到相应的字符串。
使用$regex运算符进行模式匹配
MongoDB中的regex运算符用于在集合中搜索特定的字符串。
比如在上面我们向目标集合中添加的文档们,我现在想要查询有“丹”字出现的文档。我就可以使用正则表达式类指定搜索条件。
#使用正则表达式来制定搜索条件
db.ExampleDB.find({员工姓名 : {$regex : "丹"}}
).forEach(printjson)
代码解释:
在这里,查找了所有带“丹”字符的员工姓名。因此使用$ regex运算符来定义“ 丹”的搜索条件,也能从结果看到返回了包含对应汉字的文档。
使用正则表达式中的语法对查询规则进行精准描述
规则“^”
比如我们可以使用在匹配规则字符串前添加“^”来保证匹配的时候前面是没有字符的。
可从结果看到“^”符号的作用就是规定在查找的时候关键字前面不能有其他字符。
规则“$”
还可以使用$符号规则来规定在匹配字符的后面不允许有其他字符
从两次的结果可以看到在加上$符号后,在关键字后面如果有字符就不在参与搜索了。
其他规则
字符匹配
元字符 .
可以匹配除换行符之外的任何字符。
例如:. "
可以匹配任何字符串,包括空字符串。
字符集合
用花括号 []
表示一个字符集合,可以匹配其中任意一个字符。
例如:[abc]
可以匹配字符 a
、b
或 c
。
字符范围
用连字符 -
表示字符范围,可以匹配一定范围内的字符。
例如:[a-z]
可以匹配小写字母。
否定字符集合
用花括号 [^]
表示一个否定字符集合,可以匹配除了其中指定的字符之外的任何字符。
例如:[^abc]
可以匹配除了字符 a
、b
或 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中这个选项就说明在这些定界符中指定了搜索的条件。
具体正则表达式如何书写可以根据上面提供过的文档来书写。
相关文章:

MongoDB文档-进阶使用-MongoDB索引-createindex()与dropindex()-在MongoDB中使用正则表达式来查找
阿丹: 之前研究了MongoDB的基础增删改查。在学会基础的数据库增删改查肯定是不够的。这个时候就涉及到了数据库搜索的时候的效率。需要提高数据的搜索效率。 MongoDB索引 在所以数据库中如果没有数据索引的时候。如果需要查找到一些数据。都会去主动扫描所有可能存…...

CentOS下ZLMediaKit的可视化管理网站MediaServerUI使用
一、简介 按照 ZLMediaKit快速开始 编译运行ZLMediaKit成功后,我们可以运行其合作开源项目MediaServerUI,来对ZLMediaKit进行可视化管理。通过MediaServerUI,我们可以实现在浏览器查看ZLMediaKit的延迟率、负载率、正在进行的推拉流、服务器…...

回归预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元多输入单输出回归预测
回归预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-BiGRU鹈鹕…...

Rust 原生支持龙架构指令集
导读近日,Rust 开源社区发布 1.71.0 版本,实现对龙架构(LoongArch)指令集的原生支持。 龙架构操作系统发行版和开发者可基于上游社区源代码构建或直接下载 Rust 开源社区发布的龙架构二进制版本。Rust 开发者将在龙架构平台上获得…...

为生成式AI提速,亚马逊云科技Amazon EC2 P5满足GPU需求
生成式AI(Generative AI)已经成为全球范围内的一个重要趋势,得到越来越多企业和研究机构的关注和应用。纽约时间7月26日,亚马逊云科技数据库、数据分析和机器学习全球副总裁Swami Sivasubramanian在亚马逊云科技举办的纽约峰会上更…...

聊聊企业数据安全那些事~
保护企业数据安全的重要性与方法 随着信息技术的快速发展,企业数据的安全性变得越来越重要。在数字化时代,企业的核心业务和关键信息都存储在电脑系统中,一旦遭受到数据泄露、黑客攻击或恶意软件感染,将可能对企业造成严重的损害…...
日常随笔——如何把excel题库转换为word打印格式
将Excel题库转换为Word可以通过编程的方式实现。以下是一个使用Python的示例代码,该代码使用openpyxl库读取Excel文件,并使用python-docx库创建和保存Word文档。 首先,请确保已经安装了 openpyxl 和 python-docx 库。可以使用以下命令进行安…...
SpringCloud项目打包注意事项以及可能出错的几种情况
SpringCloud项目打包注意事项和可能出错的几种情况 1、检查子模块中的 parent的pom文件路径 \<relativePath/\>2、检查打包插件的位置3、检查module是否重复引用 欢迎访问我的个人博客:https://wk-blog.vip 1、检查子模块中的 parent的pom文件路径 <relat…...

ZABBIX 6.4 Mysql数据库分表
ZABBIX监控设备较多的时候,Mysql数据库容易成为性能的瓶颈,可以通过数据库分表的方式来进行优化。步骤如下: 一、停用zabbix服务 # 避免修改分区表时,数据还有写入 systemctl stop zabbix 二、备份MySQL zabbix DB 避免修改分…...
多线程-Runable和Callable的区别
在Java中,多线程可以通过实现Runnable接口或使用Callable接口来实现。这两种方式有一些区别,如下所示: 返回值: Runnable接口的run()方法没有返回值,它表示一个没有返回结果的任务。Callable接口的call()方法有返回值…...

智慧城市规划新引擎:探秘数字孪生中的二维与三维GIS技术差异
智慧城市作为人类社会发展的新阶段,正日益引领着我们迈向数字化未来的时代。在智慧城市的建设过程中,地理信息系统(GIS)扮演着举足轻重的角色。而在GIS的发展中,二维和三维GIS作为两大核心技术,在城市规划与…...

Python入门自学进阶-Web框架——38、redis、rabbitmq、git
缓存数据库redis: NoSQL(Not only SQL)泛指非关系型的数据库。为了解决大规模数据集合多重数据类的挑战。 NoSQL数据库的四大分类: 键值(Key-Value)存储数据库列存储数据库文档型数据库图形(…...

论 SoC上的Linux如何拉动外部I/O
在MCU中(如classic autosr或其他RTOS),一般可以直接通过往对应的寄存器(地址转为指针)写值, 或者调用一些硬件抽象层或者驱动接口来拉动芯片提供的GPIO。 但是在Linux中,可能不会让应用层直接去…...

SpringBoot项目如何部署SSL证书 (JKS格式)
1、SpringBoot项目如何部署SSL证书 (JKS格式) 1. 获取 SSL 证书和私钥 首先,你需要获取有效的 SSL 证书和私钥。SSL 证书是一种用于加密通信的数字证书,它可以通过购买商业 SSL 证书或使用免费的 Let’s Encrypt 证书获得。请确保你拥有证书文件和与之…...
成功解决:ValueError Cannot assign non-leaf Tensor to parameter ‘weight‘
成功解决:ValueError Cannot assign non-leaf Tensor to parameter ‘weight‘ 欢迎大家来到安静到无声的《模式识别与人工智能(程序与算法)》,如果对所写内容感兴趣请看模式识别与人工智能(程序与算法)系列讲解 - 总目录,同时这也可以作为大家学习的参考。欢迎订阅,优…...
面试之快速学习SQL-基础增删改查语句
1. SELECT SELECT column1,column2,column3 FROM table_name;SELECT * FROM table_name;2. SQL SELECT DISTINCT 语句 在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。 SE…...

nuxt脚手架创建项目
在初始化时遇到一个依赖找不到的问题,记录一下,如有遇到同样问题的小伙伴,希望能给你们一点指引。 从安装脚手架开始,首先 一:安装nuxt脚手架 1. C盘全局安装: npm i -g create-nuxt-app 安装后可creat…...

复现原型链污染漏洞
目录 一、复现原型链污染漏洞 hackit 2018 1、创建hackit_2018.js文件 2、运行hackit_2018.js文件 3、寻找原型链漏洞 4、污染原型链 hackit 2018 1、创建hackit_2018.js文件 const express require(express) var hbs require(hbs); var bodyParser require(body-par…...

.Net6 Web Core API 配置 Autofac 封装 --- 依赖注入
目录 一、NuGet 包导入 二、Autofac 封装类 三、Autofac 使用 四、案例测试 下列封装 采取程序集注入方法, 单个依赖注入, 也适用, 可<依赖注入>的地方配置 一、NuGet 包导入 Autofac Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy 二、Auto…...

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统 em
Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...