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环境搭建 注:必须在当前的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
前言 在上一篇文章中,我们讨论了如何使用 Provider 在 Flutter 中进行状态管理。 本篇文章我们来讨论如何使用多个 Provider。 在 Flutter 中,使用 Provider 管理多个不同的状态时,你可以为每个状态创建一个单独的 ChangeNotifierProvider…...
标识符和关键字的区别是什么,常用的关键字有哪些?自增自减运算符,移位运算符continue、break、return的区别是什么?
标识符和关键字的区别是什么,常用的关键字有哪些? 标识符标识符就是当我们给变量,方法,类命名时候的名字,而被赋予特殊含义的标识符就是关键字。例如生活中,当我们需要开一家店时候,我们不能将…...

在VS Code上搭建Vue项目教程(Vue-cli 脚手架)
1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境,就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1)具体安装步骤操作即可: 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 功能: Docker 是一款可以将程序和环境打包并运行的工具软件。通过 Docker,可以将程序及其依赖环境打包,确保在不同操作系统上一致的运行效果。 环境一致性问题: 程序依赖于特定的环境,不同操作系统…...

敲详细的springframework-amqp-rabbit源码解析
看源码时将RabbitMQ的springframework-amqp-rabbit和spring-rabbit的一套区分开,springboot是基于RabbitMQ的Java客户端建立了简便易用的框架。 springboot的框架下相对更多地使用消费者Consumer和监听器Listener的概念,这两个概念不注意区分容易混淆。…...
Telegram Bot、小程序开发(三)Mini Apps小程序
文章目录 一、Telegram Mini Apps小程序二、小程序启动方式三、小程序开发小程序调试模式初始化小程序Keyboard Button Mini Apps 键盘按钮小程序【依赖具体用户信息场景,推荐】**Inline Button Mini Apps内联按钮小程序**initData 的自动传递使用内联菜单时候哪些参数会默认传…...

Django F()函数
F()函数的作用 F()函数在Django中是一个非常强大的工具,主要用于在查询表达式中引用模型的字段。它允许你在数据库层面执行各种操作,而无需将数据加载到Python内存中。这不仅提高了性能,还允许你利用数据库的优化功能。 字段引用 在查询表达…...
GraphRAG的实践
好久没有体验新技术了,今天来玩一下GraphRAG 顾名思义,一种检索增强的方法,利用图谱来实现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智能监管方案助力动物园安全与秩序管理
一、背景分析 近日,某大熊猫参观基地通报了4位游客在参观时,向大熊猫室外活动场内吐口水的不文明行为。这几位游客的行为违反了入园参观规定并可能对大熊猫造成严重危害,已经被该熊猫基地终身禁止再次进入参观。而在此前,另一熊猫…...

FairGuard游戏加固入选《嘶吼2024网络安全产业图谱》
2024年7月16日,国内网络安全专业媒体——嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》(以下简称“产业图谱”)。 本次发布的产业图谱,共涉及七大类别,127个细分领域。全面展现了网络安全产业的构成和重要组成部分,探…...
数据仓库事实表
数据仓库中的三种常见事实表类型:事务事实表、周期快照事实表和累积快照事实表 事务事实表: 事务事实表是记录事务级别数据的事实表。它记录了每个事务发生的具体度量指标,如销售金额、数量等。事务事实表的优势在于能够提供详细的事务级别…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...