Mongodb文档和数组的通配符索引

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第97篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。威赞文章都是结合官方文档,翻译整理而来,并对每个知识点的描述都认真思考和实践,对难以理解的地方,使用简单容易理解的方式进行阐述。

概述

Mongodb的通配符索引,为灵活可变的Mongodb数据结构提供了高效的查询方法。本文结合Mongodb官方文档,详细介绍在嵌入式文档和数组上,通配符索引的结构。

Mongodb为嵌入式文档和数组字段建立通配符索引时,有特殊的逻辑:

  • 当为文档对象建立通配符索引时,Mongodb会扫描文档对象的每一个字段,将文档的每一个字段都加入到该通配符索引中。如果该字段值也是文档对象,则继续向下扫描,将该文档类型的字段添加到通配符索引。
  • 当为数组对象建立通配符索引时, Mongodb会扫描数组中的每一个元素,将每一个元素的内容添加到通配符索引。如果该元素是个数组,则将数组整体放入的通配符索引中。当数组元素是对象时,则按照添加对象的方式,将该对象的每一个字段添加到通配符索引。
  • 对于其他类型的字段,通配符索引保存基本的数据类型值。即非对象,非数组类型值。

通配符索引会持续转换构建索引时遇到的嵌套文档或数组,直到遇到基本数值为止。Mongodb将基本数值和该字段的路径,都放入到通配符索引当中。

应用

为文档对象建立通配符索引

构建集合users并插入数据

db.users.insertOne({account: {user_name: "SuperAdmin01",contact: {email: "xyz@example.com",phone: "1234567890"},access: {group: "admin"}}
})

在account字段添加通配符索引

db.users.createIndex({"account.$**": 1})

Mongodb在构建通配符索引时,会解析account对象的每一个字段 ,将每一个字段的值和路径放到索引中

  • "account.username": "SuperAdmin01"
  • "account.contact.email": "xyz@example.com"
  • "account.contact.phone": "1234567890"
  • "access.group": "admin"

为数组对象添加通配符索引

创建fleet集合并添加数据

db.fleet.insertOne({ship: {coordinates: [[ 37.786971, -122.399677 ],[ 37.786971, -122.399677 ]],type: "Cargo Ship",captains: [{name: "John Doe",age: 45,crew: [ "first mate", "engineer" ]}]}
})

为ship字段添加索引

db.fleet.createIndex({"ship.$**": 1})

ship字段包含一个数组类型的字段coordinates, 字符类型的字段type, 数组类型的字段captains. 其中数组字段coordinates的元素也是数据,在构建通配符索引时,直接将coordinates字段的数组放入索引当中。captains是文档类型的数据,Mongodb构建通配符索引时,会进一步解析到基本元素,将基本元素放入索引当中。按照这样的规则 ,索引当中,存在下面的数据

  • "ship.coordinates":[37.786971, -122.399677 ],
  • "ship.coordinates":[37.786971, -122.399677 ],
  • "ship.type":"Cargo Ship",
  • "ship.captains.name":"John Doe",
  • "ship.captains.age":45,
  • "ship.captains.crew":"first mate",
  • "ship.captains.crew":"first engineer"

从上面的例子当中可以看到,在构建索引时,并没有把元素在数组中的位置也添加到索引当中。但mongdb也能够使用通配符索引,支持带有数组元素位置的查询。如

db.fleet.find({"ship.captains.0.age": {$gt: 40}})

查看该查询的执行计划

但通配符索引,不支持下面的查询

db.fleet.find({"ship.coordinates.0.1": 37.786971
})

查看执行计划,能够看到使用全表扫描,而不是通配符索引。因为通配符索引将整个数组元素作为整体放倒索引数据中。而用户使用数组当中的一个值来查询时,Mongodb选择了全表扫描。

Mongodb在构建通配符索引时,不会限制文档数组类型结构的深度。但查询时,如果路径长度超过8, Mongodb会选择其他更高效的索引或全表扫描的方式。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

老板电器发布首个烹饪AI模型,揭秘其如何引领厨电行业变革

数字发展日新月异,智慧产品迭代更新。当前,我们或许正身处一场连科学巨人也无法预见的深度变革之中。现代科技使得普通人无需深入学习数学或编程知识,也能借助手机或电脑,体验“苏格拉底式”的在线指导,或者与“乔布斯…

【LeetCode、牛客】链表分割、链表的回文结构、160.相交链表

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:数据结构 📚本系列文章为个人学…

面试经典 114. 二叉树展开为链表

最近工作越来越难找,裁员越来越懂了,焦虑的睡不着,怎么办呢,只能刷面试题,卷死你们 今天这个题目没刷过,我思考了半天才只能用暴力,后来苦思冥想才想出来简单的方法,废话不多说&…

【音视频】RTSP、RTMP与流式传输

文章目录 前言RTSP与RTMPRTSP(Real-Time Streaming Protocol)RTMP(Real-Time Messaging Protocol)主要差异 什么是流式传输?流式传输的特点流式传输与传统下载的区别 使用VLC播放RTSP监控 总结 前言 在现代网络环境中…

uni-app声生命周期

应用的生命周期函数在App.vue页面 onLaunch:当uni-app初始化完成时触发(全局触发一次) onShow:当uni-app启动,或从后台进入前台时显示 onHide:当uni-app从前台进入后台 onError:当uni-app报错时触发,异常信息为err 页面的生命周期 onLoad…

html+css+js前端作业 王者荣耀官网5个页面带js

htmlcssjs前端作业 王者荣耀官网5个页面带js 下载地址 https://download.csdn.net/download/qq_42431718/89574989 目录1 目录2 目录3 项目视频 王者荣耀5个页面(带js) 页面1 页面2 页面3 页面4 页面5

四步实现网站HTTPS访问

随着网络安全的重要性日益凸显,HTTPS(超文本传输安全协议)已成为现代网站的标准配置。HTTPS协议作为HTTP协议的安全版本,通过SSL协议加密数据传输,不仅能保护用户数据的安全,还能提升搜索引擎排名&#xff…

07-workqueue

想系统学习k8s源码,云原生的可以加:mkjnnm 今天我们来详细研究下 workqueue 相关代码。client-go 的 util/workqueue 包里主要有三个队列,分别是普通队列,延时队列,限速队列,后一个队列以前一个队列的实现为…

Java基础巩固——JDK 8、9新增接口的特性(接口中定义非抽象方法、静态方法和私有方法)

#Java学了这么久,项目也做了?基础知识还不巩固?快来关注我的这篇系列博客——Java基础复习巩固吧# 目录 引言 一、JDK8新特性:允许在接口中定义非抽象方法和静态方法。 注意事项 二、JDK9新特性:允许在接口中定义p…

“科技创新‘圳’在变革”2025深圳电子展

电子产业作为现代社会的核心驱动力之一,正以前所未有的速度发展。在这样的背景下,深圳作为中国的经济特区和创新高地,又一次迎来了备受瞩目的盛会——2025深圳电子展览会。本次展览会定于2025年4月9日至11日,在深圳会展中心&#…

Photos框架 - 自定义媒体资源选择器(数据部分)

引言 在iOS开发中,系统已经为我们提供了多种便捷的媒体资源选择方式,如UIImagePickerController和PHPickerViewController。这些方式不仅使用方便、界面友好,而且我们完全不需要担心性能和稳定性问题,因为它们是由系统提供的&…

Java Selenium WebDriver:代理设置与图像捕获

在网络爬虫和自动化测试领域,Selenium WebDriver 是一个非常流行的工具,它允许开发者模拟用户在浏览器中的操作。然而,出于安全或隐私的考虑,有时我们需要通过代理服务器来发送请求。本文将介绍如何在Java环境中使用Selenium WebD…

MSQP Mysql数据库权限提升工具,UDF自动检测+快速反向SHELL

项目地址:https://github.com/MartinxMax/MSQP MSQP 这是一个关于Mysql的权限提升工具 安装依赖 $ python3 -m pip install mysql-connector-python 使用方法 $ python3 msqp.py -h 权限提升:建立反向Shell 在建立反向连接前,该工具会自动检测是否具有提权条件&#xff0…

01。配置DevEcoStudio的中文界面方法

打开项目 点击File >> 点击Setting (或者按快捷键 Ctrl alt S) 选择 Plugins (扩展)>> 输入 chinese >>点击 Enable 点击 apply >OK 弹出窗口点击 Restart finish(完成)hiahia…

文件共享功能无法使用提示错误代码0x80004005【笔记】

环境情况: 其他电脑可以正常访问共享端,但有一台电脑访问提示错误代码0x80004005。 处理检查: 搜索里输入“启用或关闭Windows功能”按回车键,在“启用或关闭Windows功能”里将“SMB 1.0/CIFS文件共享支持”勾选后(故…

hipBLAS示例程序

GPT-4o (OpenAI) 当然!以下是一个简单示例,展示了如何使用hipBLAS库进行矩阵-向量乘法 (GEMV) 的操作。该示例包括初始化 hipBLAS 环境,设置矩阵和向量数据并调用hipBLAS API来执行操作。 首先,确保你已经安装了 ROCm&#xff08…

【Web】LitCTF 2024 题解(全)

目录 浏览器也能套娃? 一个....池子? 高亮主题(划掉)背景查看器 百万美元的诱惑 SAS - Serializing Authentication exx 浏览器也能套娃? 随便试一试,一眼ssrf file:///flag直接读本地文件 一个....池子? {…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署MimicMotion :利用可信度感知姿势指导生成高质量人体运动视频

目录 项目介绍 项目相关工作 图像/视频生成的扩散模型 姿势引导的人体动作转移 生成长视频 方法实践 与最先进方法的比较 消融研究 部署验证 1. 下载项目: 2. 建立环境 3. 下载参数模型 A. 下载 DWPose 预训练模型:dwpose B. 从 Huggingfa…

redis的使用场景

目录 1. 热点数据缓存 1.1 什么是缓存? 1.2 缓存的原理 1.3 什么样的数据适合放入缓存中 1.4 哪个组件可以作为缓存 1.5 java使用redis如何实现缓存功能 1.5.1 需要的依赖 1.5.2 配置文件 1.5.3 代码 1.5.4 发现 1.6 使用缓存注解完成缓存功能 2. 分布式锁…

从0到1:理发店预约剪发小程序开发笔记(上)

背景 理发师可以在小程序上设置自己的可预约时间,价格,自我介绍,顾客可以根据理发师的日程安排选择合适的时间进行预约和支付。这样可以提高预约的效率,减少沟通成本,方便双方的安排。 功能规划 首页展示&#xff1…