Mongodb多键索引中索引边界的混合

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第93篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。

Mongodb为提高数组的查询效率,针对数组构建了多键索引。而Mongodb在应用多键数组查询时,也通过构建,减少数组查询的数值范围,来提高查询性能。本文结合Mongodb官方文档,阐述Mongodb在使用多键索引时的边界优化。

概述

索引边界定义了索引值的区间段。Mongodb在查询时,用这个区间段来查询索引中的数据。当用户针对索引字段指定多个查询条件时,mongdb尝试合并这些查询条件的区间范围来计算出更小的范围区间,来获得更快的查询速度并减少资源利用。

使用多键索引的边界交集来查询

边界交集代表多个边界相互重合的点。如有两个区间[3, 无穷大]和[无穷小,6],这两个区间的交集就是[3,6]。Mongodb将这种求交集的方式,应用到数据查询当中。有一个构建了索引的数组字段,当使用$elemMatch指定多个查询条件查询数据时,Mongodb会将查询条件合并。下边的例子,说明了这种查询优化方法。

构建结合students并插入数据

db.students.insertMany([{_id: 1, name: 'Shawn', grades: [70,85]},{_id: 2, name: 'Elena', grades: [92, 84]}
])

为数组创建多键索引

db.students.createIndex({grades: 1})

构建查询语句

db.students.find( { grades: { $elemMatch: { $gte: 90, $lte:99 } } } )

这个语句中,只要数组中任何一个数据符合大于等于90,小于等于99的数据。

单独分析每个查询条件,第一个边界是[90,无穷大],第二个边界是[无穷小,99],在使用$elemMatch时,mongodb先计算两个边界的交集[90,99]

当不使用$elemMatch时,Mongodb不会先计算边界的交集。

db.students.find( { grades: { $gte: 90, $lte:99 } }  )

该查询会查询出满足下面两个条件的文档

  • 数组grades中至少有一个元素大于等于90
  • 数组grades中至少有一个元素小于等于99

因为没有使用$elemMatch, Mongodb不会计算边界的交集。而是使用两个边界中的任何一个来查找,不能保证使用哪一个条件。

从解释计划当中也能看出来两者查询数据范围的不同

db.students.find( { grades: { $elemMatch: { $gte: 90, $lte:99 } } } ).explain()db.students.find( { grades: { $gte: 90, $lte:99 } }  ).explain()

下面两张图片中,左边使用了$elemMatch, 右侧没有使用

复合多键索引边界混合

复合边界集合了复合多键索引中的边界。使用复合多键索引的多个字段边界值,能够减少查询时间。Mongodb不需要单独计算每个边界的查询结果。如符合索引{temperature: 1, humidity: 1}有下面的两个边界

  • 温度[80, 无穷大]
  • 湿度[无穷小,20]

则计算出来的复合边界就是

{ temperature: [80, 无穷大], humidity: [无穷小,20]}

如果mongodb不能将这两个边界混合,mongodb只能够使用前面的字段索引来查询数据。在这个例子中,前面的字段是temperature。下面的应用,详细描述了mongodb在复合多键索引中的边界混合。

非数组字段和数组字段的边界混合

这个例子展示了mongodb通过混合边界来定义更高效的查询约束提高性能

构建survey集合并插入数据

db.survey.insertMany([{ _id: 1, item: "abc", ratings: [ 2, 5, 8 ] },{ _id: 2, item: "xyz", ratings: [ 5, 8 ] }
])

创建复合多键索引

db.survey.createIndex({item: 1, ratings: 1})

构建查询语句

db.survey.find({item: "abc", ratings: { $gte: 3}})

直接看执行计划,会更清楚一些

该查询使用字段item和数组字段rating进行查找。单独来看么一个查询条件

item字段值是“abc”, mongodb在执行时,转换为边界["abc", "abc"]

rating边界是{$gte: 3},转换为[3,无穷大]

mongodb将两个边界组合进行查询

非数组字段和多个数组字段的边界混合

下面的例子展现了mongodb怎样将非数组字段和多个数组字段的边界混合

构建集合survey2并插入数据

db.survey2.insertMany([{ _id: 1, item: "abc", ratings: [ { score: 2, by: "mn"}, { score: 9, by: "anon"}] },{ _id: 2, item: "xyz", ratings: [  { score: 5, by: "anon"}, { score: 7, by: "wv"}] }
])

为集合添加符合多键索引

db.survey2.createIndex({item: 1, "ratings.score": 1, "ratings.by": 1})

构建查询语句

db.surver2.find({item: "xyz", "ratings.score": { $lte: 5}, "ratings.by": "anon"})

单独看每个查询条件

  • item字段的边界 item: "xyz", 转换为[["xyz", "xyz"]]
  • score的边界是{$lte:5},转换为[无穷小, 5],
  • by的边界是 by: "anon",转换为["anon", "anon"]

Mongodb 将item的边界和ratings.score或ratings.by当中的一个边界混合,取决于查询操作符和索引值。当mongodb不能确认使用哪个边界来进行混合。执行计划也无法确定使用哪个索引来进行查询。

为了保证mongodb能够将文档数组中的边界混合,必须使用$elemMatch操作符

混合相同数组中多个字段的边界

为了能够混合相同数组中多个字段的索引边界,必须满足下面两个条件

  • 除了字段名称以外,索引键必须在相同的路径上
  • 查询语句必须使用$elemMatch查询相同路径上的值

在嵌入式文档数组中,使用点操作符的字段名称,如“a.b.c.d”, 就是字段d的字段路径。为了能够混合相同数组中的多个边界,$elemMatch必须在这个路径上,并且不包含字段本身。如“a.b.c”

在前面创建的集合survey2中添加索引

db.surver2.createIndex({"ratings.score": 1, "ratings.by": 1})

构建查询语句, 使用$elemMatch操作符查询ratings字段,查询出满足两个条件的数据。

db.surver2.find({ratings: {$elemMatch: {score: {$lte: 5}, by: "anon"}}})

看查询计划,能够看到mongodb混合了两个边界为一个边界

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

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

相关文章

linux进程——概念理解与PCB

前言:本篇讲解Linux进程概念相关内容。 操作系统被称为计算机世界的哲学, 可以见得操作系统的知识并不好理解。 对于这篇进程概念的讲解, 博主认为, 如果没有一些前置知识的话,里面的有些概念并不好理解。 但是如果学习…

TDesign组件库日常应用的一些注意事项

【前言】Element(饿了么开源组件库)在国内使用的普及率和覆盖率高于TDesign-vue(腾讯开源组件库),这也导致日常开发遇到组件使用上的疑惑时,网上几乎搜索不到其文章解决方案,只能深挖官方文档或…

防溺水预警系统引领水域安全新篇章

一、系统概述 随着人们对水域活动的需求增加,溺水事故频发,给人们的生命安全带来了严重威胁。然而,如今,一项创新科技正在以强大的功能和无限的潜力引领着水域安全的新篇章。智能防溺水预警系统,作为一种集成了智能感知…

文心一言:如何备考软考架构师

提问:软考高级:架构师指导,有哪些考点、重点考点有哪些?需要如何备考?案例分析题如何做?论文如何写? 文心一言回答1700字如下: 针对软考高级架构师的考试,以下是对考点、重点考点、备…

MongoDB自学笔记(三)

一、前文回顾 上一篇文章中我们学习了更新操作&#xff0c;以及讲解了部分的更新操作符&#xff0c;今天我们继续学习剩余的更新操作符。 二、更新操作符 1、$rename 语法&#xff1a;{ $rename: { < field1 >: < newName1 >, < field2 >: < newName2…

JDK、JRE、JVM的区别java的基本数据类型

说一说JDK、JRE、JVM的区别在哪&#xff1f; JDK&#xff1a; Java Delopment kit是java工具包&#xff0c;包含了编译器javac&#xff0c;调试器&#xff08;jdb&#xff09;以及其他用于开发和调试java程序的工具。JDK是开发人员在开发java应用程序时候所需要的的基本工具。…

Linux - 基础开发工具(yum、vim、gcc、g++、make/Makefile、git、gdb)

目录 Linux软件包管理器 - yum Linux下安装软件的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式各命令汇总 vim底行模式各命令汇总 vim的简单配置 Linux编译器 - gc…

R语言实现SVM算法——分类与回归

### 11.6 基于支持向量机进行类别预测 ### # 构建数据子集 X <- iris[iris$Species! virginica,2:3] # 自变量&#xff1a;Sepal.Width, Petal.Length y <- iris[iris$Species ! virginica,Species] # 因变量 plot(X,col y,pch as.numeric(y)15,cex 1.5) # 绘制散点图…

[Redis]典型应用——缓存

什么是缓存 缓存&#xff08;Cache&#xff09;是一种用于临时存储数据的机制&#xff0c;目的是提高数据访问速度和系统性能。 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方&#xff0c;方便随时读取 缓存是一个相对的概念&#xff0c;比如说&#xff0c…

uniapp转小程序,小程序转uniapp方法

&#x1f935; 作者&#xff1a;coderYYY &#x1f9d1; 个人简介&#xff1a;前端程序媛&#xff0c;目前主攻web前端&#xff0c;后端辅助&#xff0c;其他技术知识也会偶尔分享&#x1f340;欢迎和我一起交流&#xff01;&#x1f680;&#xff08;评论和私信一般会回&#…

数据结构day2

一、思维导图 内存分配 二、课后习题 分文件编译 //sys.h #ifndef TEST_H #define TEST_H #define MAX_SIZE 100//定义学生类型 typedef struct Stu {char name[20]; //姓名int age; //年龄double score; //分数 }stu;//定义班级类型 typedef struct Class {struct …

给Wordpress添加评分功能到评论表单

今天要 给你的 Wordpress 添加评分功能到评论表单 吗&#xff1f; 评分功能效果图 什么类型的网站需要评分&#xff1f; 资源站教程站其他&#xff0c;我也没想到。。。 但我这个网站&#xff0c;因为是电影类的网站&#xff0c;好像还是有点需要的&#xff0c;所以&#xf…

防洪墙的安全内容检测+http请求头

1、华为的IAE引擎&#xff1a;内部工作过程 IAE引擎主要是针对2-7层进行一个数据内容的检测 --1、深度检测技术 (DPI和DPF是所有内容检测都必须要用到的技术) ---1、DPI--深度包检测&#xff0c;针对完整的数据包&#xff0c;进行内容的识别和检测 1、基于特征子的检…

【字幕】字幕特效入门

前言 最近两周调研了一下字幕特效的底层程序逻辑&#xff0c;因为工作内容的原因&#xff0c;就分享几个自己找的链接具体细节就不分享了&#xff0c;CSDN也是我的个人笔记&#xff0c;只记录一些简单的内容用于后续自己方便查询&#xff0c;顺便帮助一下正在苦苦查阅资料入门…

详细的等保测评攻略

信息安全等级保护是中国特有的信息安全保障体系&#xff0c;旨在根据信息系统的重要性对其进行分级保护。随着技术的进步和威胁的变化&#xff0c;等保标准也在不断更新。等保2.0自2019年12月1日起施行&#xff0c;相较于之前的版本&#xff0c;它不仅涵盖了传统信息系统&#…

Spring Data Jpa 原生SQL联表查询返回自定义DTO

Spring Data Jpa 原生SQL联表查询返回自定义DTO 方案一&#xff1a;返回Map 这个就不说了 方案二&#xff1a;实体定义成接口的形式 该方式最直观&#xff01;&#xff01;推荐&#xff01;&#xff01;&#xff01; 注意&#xff1a;XxxDto是interface接口&#xff0c;而…

LabVIEW 与 PLC 通讯方式

在工业自动化中&#xff0c;LabVIEW 与 PLC&#xff08;可编程逻辑控制器&#xff09;的通信至关重要&#xff0c;常见的通信方式包括 OPC、Modbus、EtherNet/IP、Profibus/Profinet 和 Serial&#xff08;RS232/RS485&#xff09;。这些通信协议各有特点和应用场景&#xff0c…

【开发指南】HTML和JS编写多用户VR应用程序的框架

1.概述 Networked-Aframe 的工作原理是将实体及其组件同步到连接的用户。要连接到房间&#xff0c;您需要将networked-scene组件添加到a-scene元素。对于要同步的实体&#xff0c;请向其添加networked组件。默认情况下&#xff0c;position和rotation组件是同步的&#xff0c;…

LabVIEW电路产品功能自动检测系统

开发基于LabVIEW的电路产品功能自动检测系统。该系统通过整合先进的硬件和软件技术&#xff0c;实现了电路产品的自动化测试&#xff0c;显著提高了测试效率和准确性&#xff0c;对于提升电子产品的可靠性和工作效率具有重要意义。 项目背景 在电子制造业中&#xff0c;电路产…

2.javaWeb_请求和响应的处理(Request,Response)

2.请求和响应的处理 文章目录 2.请求和响应的处理一、动态资源和静态资源javax.servlet(包) 二、Servlet体系1.简介2.HttpServlet3.Servlet生命周期 三、Request对象1.ServletRequest1)ServletRequest主要功能有&#xff1a;2)ServletRequest类的常用方法: 2.HttpServletReques…