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

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会选择其他更高效的索引或全表扫描的方式。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JAVA小白学习日记Day10
  • maven引入了jar包但在class文件里找不到jar包里的类
  • windows上启动Kafka
  • 暑期C++ 缺省参数
  • 视觉-语言大模型应用
  • 大厂面经:大疆嵌入式面试题及参考答案(4万字长文:持续更新)
  • 20240730 每日AI必读资讯
  • 使用easypoi读取Excel模板
  • JAVA8中的Stream API是什么及其用法
  • 数据结构(二叉树-2)
  • TCP/IP的三次握手和四次握手
  • 【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】
  • 【Opencv】色彩空间 color space
  • CSS布局:左侧一个固定元素, 右侧元素数量不定, 要求右侧元素数量多时直接另起一行, 左侧元素单独一行
  • vscode搭建rust开发环境
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 07.Android之多媒体问题
  • Android 控件背景颜色处理
  • Bootstrap JS插件Alert源码分析
  • CSS3 变换
  • gcc介绍及安装
  • JSONP原理
  • React Transition Group -- Transition 组件
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Vue ES6 Jade Scss Webpack Gulp
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从重复到重用
  • 给初学者:JavaScript 中数组操作注意点
  • 后端_ThinkPHP5
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 码农张的Bug人生 - 见面之礼
  • 使用parted解决大于2T的磁盘分区
  • 小程序 setData 学问多
  • 云大使推广中的常见热门问题
  • 正则表达式小结
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #pragma 指令
  • #传输# #传输数据判断#
  • $.ajax()方法详解
  • (02)Hive SQL编译成MapReduce任务的过程
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)Hilt的基本概念和使用
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2)Java 简介
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (六)Hibernate的二级缓存
  • (三)Honghu Cloud云架构一定时调度平台
  • (四) Graphivz 颜色选择
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测