当前位置: 首页 > news >正文

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混合了两个边界为一个边界

相关文章:

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

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

如何利用windows本机调用Linux服务器,以及如何调用jupyter界面远程操控

其实这篇文章没必要存在,教程太多了 参考博客(1 2 3),如侵删 奈何网上的大神总是会漏掉一些凡人遇到的小问题 (1) 建议下载PuTTy for windows,从而建立与远程服务器的SSH连接 需要确认目标服…...

如何定位Milvus性能瓶颈并优化

假设您拥有一台强大的计算机系统或一个应用,用于快速执行各种任务。但是,系统中有一个组件的速度跟不上其他部分,这个性能不佳的组件拉低了系统的整体性能,成为了整个系统的瓶颈。在软件领域中,瓶颈是指整个路径中吞吐…...

阿里云服务器 篇三:提交搜索引擎收录

文章目录 系列文章推荐:为网站注册域名判断网站是否已被搜索引擎收录主动提交搜索引擎收录未查询到收录结果时,根据提示进行提交网站提交网站时一般需要登录账号主动提交网站可缩短爬虫发现网站链接时间,但不保证一定能够收录所提交的网站百度提交地址360搜索提交地址搜狗提…...

powe bi界面认识及矩阵表基本操作 - 1

powe bi界面认识及矩阵表操作 1. 界面认识1.1 选择数据源1.2 选择相关表及点击加载1.3 表字段显示位置1.4 表属性按钮位置1.5 界面布局按钮认识 2. 矩阵表基本操作2.1 选择矩阵表2.2 创建矩阵表2.3 设置字体大小2.4 行填充:修改高度2.5 列宽:设置列的宽度…...

SpringBoot 项目 pom.xml 中 设置 Docker Maven 插件

在Spring Boot项目中,使用Docker Maven插件(通常是docker-maven-plugin或者fabric8io/docker-maven-plugin)来自动化构建Docker镜像并将其推送到远程仓库。 这里分别介绍这两种插件的基本配置,并说明如何设置远程仓库推送。 1、…...

k8s二次开发-kubebuiler一键式生成deployment,svc,ingress

一 Kubebuilder环境搭建 注&#xff1a;必须在当前的K8S集群有 nginx这个ingressclass rootk8s:~# kubectl get ingressclass NAME CONTROLLER PARAMETERS AGE nginx k8s.io/ingress-nginx <none> 19h1.1 下载kubebuilder wget https://gi…...

Flutter 状态管理新境界:多Provider并行驱动UI

前言 在上一篇文章中&#xff0c;我们讨论了如何使用 Provider 在 Flutter 中进行状态管理。 本篇文章我们来讨论如何使用多个 Provider。 在 Flutter 中&#xff0c;使用 Provider 管理多个不同的状态时&#xff0c;你可以为每个状态创建一个单独的 ChangeNotifierProvider…...

标识符和关键字的区别是什么,常用的关键字有哪些?自增自减运算符,移位运算符continue、break、return的区别是什么?

标识符和关键字的区别是什么&#xff0c;常用的关键字有哪些&#xff1f; 标识符标识符就是当我们给变量&#xff0c;方法&#xff0c;类命名时候的名字&#xff0c;而被赋予特殊含义的标识符就是关键字。例如生活中&#xff0c;当我们需要开一家店时候&#xff0c;我们不能将…...

在VS Code上搭建Vue项目教程(Vue-cli 脚手架)

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…...

AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理

AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning) 1、零样本学…...

Docker 和 k8s 之间是什么关系?

Docker 简介 Docker 功能&#xff1a; Docker 是一款可以将程序和环境打包并运行的工具软件。通过 Docker&#xff0c;可以将程序及其依赖环境打包&#xff0c;确保在不同操作系统上一致的运行效果。 环境一致性问题&#xff1a; 程序依赖于特定的环境&#xff0c;不同操作系统…...

敲详细的springframework-amqp-rabbit源码解析

看源码时将RabbitMQ的springframework-amqp-rabbit和spring-rabbit的一套区分开&#xff0c;springboot是基于RabbitMQ的Java客户端建立了简便易用的框架。 springboot的框架下相对更多地使用消费者Consumer和监听器Listener的概念&#xff0c;这两个概念不注意区分容易混淆。…...

Telegram Bot、小程序开发(三)Mini Apps小程序

文章目录 一、Telegram Mini Apps小程序二、小程序启动方式三、小程序开发小程序调试模式初始化小程序Keyboard Button Mini Apps 键盘按钮小程序【依赖具体用户信息场景,推荐】**Inline Button Mini Apps内联按钮小程序**initData 的自动传递使用内联菜单时候哪些参数会默认传…...

Django F()函数

F()函数的作用 F()函数在Django中是一个非常强大的工具&#xff0c;主要用于在查询表达式中引用模型的字段。它允许你在数据库层面执行各种操作&#xff0c;而无需将数据加载到Python内存中。这不仅提高了性能&#xff0c;还允许你利用数据库的优化功能。 字段引用 在查询表达…...

GraphRAG的实践

好久没有体验新技术了&#xff0c;今天来玩一下GraphRAG 顾名思义&#xff0c;一种检索增强的方法&#xff0c;利用图谱来实现RAG 1.配置环境 conda create -n GraphRAG python3.11 conda activate GraphRAG pip install graphrag 2.构建GraphRAG mkdir -p ./ragtest/i…...

自动驾驶三维车道线检测系列—LATR: 3D Lane Detection from Monocular Images with Transformer

文章目录 1. 概述2. 背景介绍3. 方法3.1 整体结构3.2 车道感知查询生成器3.3 动态3D地面位置嵌入3.4 预测头和损失 4. 实验评测4.1 数据集和评估指标4.2 实验设置4.3 主要结果 5. 讨论和总结 1. 概述 3D 车道线检测是自动驾驶中的一个基础但具有挑战性的任务。最近的进展主要依…...

守护动物乐园:视频AI智能监管方案助力动物园安全与秩序管理

一、背景分析 近日&#xff0c;某大熊猫参观基地通报了4位游客在参观时&#xff0c;向大熊猫室外活动场内吐口水的不文明行为。这几位游客的行为违反了入园参观规定并可能对大熊猫造成严重危害&#xff0c;已经被该熊猫基地终身禁止再次进入参观。而在此前&#xff0c;另一熊猫…...

FairGuard游戏加固入选《嘶吼2024网络安全产业图谱》

2024年7月16日&#xff0c;国内网络安全专业媒体——嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》(以下简称“产业图谱”)。 本次发布的产业图谱&#xff0c;共涉及七大类别&#xff0c;127个细分领域。全面展现了网络安全产业的构成和重要组成部分&#xff0c;探…...

数据仓库事实表

数据仓库中的三种常见事实表类型&#xff1a;事务事实表、周期快照事实表和累积快照事实表 事务事实表&#xff1a; 事务事实表是记录事务级别数据的事实表。它记录了每个事务发生的具体度量指标&#xff0c;如销售金额、数量等。事务事实表的优势在于能够提供详细的事务级别…...

LeetCode题练习与总结:两数之和Ⅱ-输入有序数组--167

一、题目描述 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index…...

在 Java 中,怎样设计一个可扩展且易于维护的微服务架构?

在Java中设计一个可扩展且易于维护的微服务架构&#xff0c;可以考虑以下几个方面&#xff1a; 模块化设计&#xff1a;将应用拆分为多个小的、独立的模块&#xff0c;每个模块负责处理特定的业务逻辑。每个模块可以独立开发、测试和部署&#xff0c;增加或替换模块时不会影响其…...

零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习

今天开始带大家零基础入门鸿蒙开发&#xff0c;也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一&#xff0c;为什么要学习鸿蒙 1-1&#xff0c;鸿蒙介绍 1-2&#xff0c;为什么要学习鸿蒙 1-3&#xff0c;鸿蒙各个版本介绍 1-4&#xff0…...

Chromium CI/CD 之Jenkins实用指南2024-在Windows节点上创建任务(九)

1. 引言 在现代软件开发流程中&#xff0c;持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;已成为确保代码质量和加速发布周期的关键实践。Jenkins作为一款广泛应用的开源自动化服务器&#xff0c;通过其强大的插件生态系统和灵活的配置选项&#xf…...

ceph进程网卡绑定逻辑

main() //如osd进程&#xff0c;是ceph_osd.cc文件的main函数&#xff1b;mon进程&#xff0c;是ceph_mon.cc文件的main函数 -->pick_addresses() // 会读取"cluster_network_interface"和"public_network_interface"这两个配置项来过滤ip ---->fill…...

学习opencv

初步学习可以参考&#xff1a; OpenCV学习之路&#xff08;附加资料分享&#xff09;_opencv资料-CSDN博客 【OpenCV】OpenCV常用函数合集【持续更新】_opencv函数手册-CSDN博客 整体框架可以参考&#xff1a; OpenCV学习指南&#xff1a;从零基础到全面掌握&#xff08;零…...

利用双端队列 实现二叉树的非递归的中序遍历

双端队列&#xff1a;双向队列&#xff1a;支持插入删除元素的线性集合。 java官方文档推荐用deque实现栈&#xff08;stack&#xff09;。 pop(): 弹出栈中元素&#xff0c;也就是返回并移除队头元素&#xff0c;等价于removeFirst()&#xff0c;如果队列无元素&#xff0c;则…...

昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要

昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要 文章目录 昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要数据集创建数据集数据预处理Tokenizer 模型构建构建GPT2ForSummarization模型动态学习率 模型训练模型推理总结打卡 数据集 实验使用nlpcc2017摘要数…...

科研绘图系列:R语言circos图(circos plot)

介绍 Circos图是一种数据可视化工具,它以圆形布局展示数据,通常用于显示数据之间的关系和模式。这种图表特别适合于展示分层数据或网络关系。Circos图的一些关键特点包括: 圆形布局:数据被组织在一个或多个同心圆中,每个圆可以代表不同的数据维度或层次。扇区:每个圆被划…...

追踪Conda包的踪迹:深入探索依赖关系与管理

追踪Conda包的踪迹&#xff1a;深入探索依赖关系与管理 Conda作为Python和其他科学计算语言的包管理器&#xff0c;不仅提供了安装、更新和卸载包的功能&#xff0c;还有一个强大的包跟踪功能&#xff0c;帮助用户理解包之间的依赖关系和管理环境。本文将详细解释如何在Conda中…...

织梦cms网站/百度爱采购平台登录

导读在上周末&#xff0c;开源的Mesa图形库背后的开发团队宣布&#xff0c;基于Linux的操作系统的最终Mesa 18.1版本发布。Mesa 18.1系列在大约18.0分支释出两个月后发布的&#xff0c;可能大多数GNU/Linux发行版目前正在使用&#xff0c;并且已经获得了第四次维护更新。 Mesa …...

做视频直播的网站/百度推广引流

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼写代码总是会出异常的&#xff0c;尤其是爬虫这类程序&#xff0c;无法确保每次请求都能稳定地返回统一的结果&#xff0c;比如反爬虫策略提升、代理IP超时、程序异常等等&#xff0c;处理好这些问题&#xff0c;才能保证爬虫程序持…...

什么是专业建设/女装标题优化关键词

在Android开发当中经常会用到了需要ScrollView嵌套GridView或者是ListView的情况&#xff0c;由于这两款控件都自带滚动条&#xff0c;当他们碰到一起的时候便会出问题&#xff0c;即GridView或ListView会显示不全。 解决方案&#xff1a; 自定义GridView或ListView&#xff0c…...

网站创建网站/搜索引擎优化排名工具

点击上方“Java之间”&#xff0c;选择“置顶或者星标”你关注的就是我关心的&#xff01;上一篇&#xff1a;MySQL性能优化之骨灰级&#xff0c;高阶神技QPS、TPS、PV、UV、GMV、IP、RPS等各种名词&#xff0c;外行看起来很牛X&#xff0c;实际上对程序员来说都是必懂知识点。…...

微信网站这么做/今日热点新闻事件摘抄50字

MSYS2是Windows下的一个工具&#xff0c;可以通过模拟Linux接口运行一部分Linux软件&#xff0c;是MinGW的增强版、Cygwin的轻量版。这篇文章介绍在VS Code中集成MSYS2的方法。配置Shell集成如果想把默认Shell直接换成MSYS2&#xff0c;只需进行如下设置&#xff1a;{"ter…...

正规的建网站公司/拉新app渠道

前提&#xff1a;使用了npm安装taro,安装的是最新版本的1.3.11的测试版本&#xff0c;导致使用npm run dev:h5的时候报错 1.运行npm run dev:h5之后的 错误信息1 错误信息2&#xff1a;UnhandledPromiseRejectionWarning: TypeError: items.forEach is not a function 2.解决方…...