Mongodb的通配符索引

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

Mongodb支持灵活的数据结构定义,同一个Collection的不同文档,可以拥有不同的字段,使用相同字段存储不同的数据类型,甚至缺少某些字段。这样灵活的数据结构,在构建索引时,应用开发人员或数据库管理员无法知道当前文档是否包含该字段,或者字段的名称是什么。Mongodb提供了通配符索引,来满足这样的应用场景。使用通配符索引,为未知字段或不确定的字段来添加索引。

概述

创建Mongodb索引时,使用通配符$**来创建通配符索引

db.collection.createIndex({ "$**": <sortOrder>})

为嵌入式文档添加索引

db.collection.createIndex({"<field>.$**": <sortOrder>})

只有当用户在不确定字段未来是否会变化,或不清楚需要创建索引的字段时,才使用通配符来创建索引。通配符索引和普通的确定字段索引的行为不一样。如果集合中因为随意的字段名称导致不能够创建索引,Mongodb官方建议首先统一字段名称。而不是创建通配符索引来代替普通索引。通配符索引,适用于下面几个场景

  • 系统应用查询的集合中文档字段不同,为该集合添加通配符索引,包含所有需要查询的字段
  • 针对字段不一致的嵌入式文档的查询,为该嵌入式文档创建通配符索引
  • 使用复合通配符索引,能够提高常用查询条件的索引覆盖率。

使用和限制

  • 用户可以在同一个集合当中添加多个通配符索引
  • 通配符索引字段可以包含其他索引字段
  • 默认通配符字段不包含_id字段。用户需要在wildcardProjection字段中显示指定_id字段
  • 通配符字段索引时稀疏的,只包含带有包含通配符字段的文档。即使该字段是null值,也会被包含在索引中
  • 通配符索引和通配符文本索引,不是同一个索引。通配符索引不支持使用$text进行文本查询。
  • 当符合下面所有条件时,通配符索引才能够支持索引覆盖查询
    • Mongodb选择通配符索引作为选中的索引
    • 查询过滤条件中只包含通配符索引当中的字段
    • 查询结果显示指定不包含_id字段,只包含查询字段
    • 指定的查询字段,不是数组字段

如在employees集合中添加通配符索引

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

该索引能够覆盖查询

db.employees.find({"last_name": "Doe"}, {"last_name": 1, "_id": 0})

查看该查询的执行计划

应用

创建集合products并插入数据

db.products.insertMany([{product_name: "Spy Coat",attributes: {material: [ "Tweed", "Wool", "Leather" ],size: {length: 72,unites: "inches"}}}, {product_name: "Spy Pen",attributes: {colors: [ "Blue", "Black" ],secret_feature: {name: "laser",power: "1000",units: "watts"}}}
])

为字段添加通配符索引

该通配符索引支持字段attributes和attributes文档中的字段查询

db.products.createIndex({"attributes.$**": 1})

查询文档数据

db.products.find({"attributes.size.length": {$gt: 60}})
db.products.find({"attributes.material": "Leather"})
db.products.find({"attributes.secret_feature.name": "laser"}, {"attributes.secret_colors": 1, product_name: 1,  "_id": 0})

指定通配符索引包含的字段

Mongodb允许用户创建通配符索引时,指定包含哪些字段或不包含哪些字段。如文档中包含多个嵌入式文档,用户可以包含这些嵌入式文档和嵌入式文档中的字段。或者用户添加通配符索引时,排除不需要查询的字段。

按照下面的语法指定包含的字段,其中1表示包含,0表示不包含


db.collection.createIndex({"$**": <sortOrder>},{"wildcardProjection": {<field1>: <0|1>,<field2>: <0|1>,...<fieldn>: <0|1>,}}
)

指定包含哪些字段时,有下面两个限制

  • wildcardProjection只能用于通配符索引中
  • 除了_id字段外,通配符索引创建时,不能同时指定包含和排除哪些字段。如下面这样的写法,是不可用的
{"wildcardProjection": {"attributes": 0,"users": 1}
}

而带有_id字段时,指定包含_id字段而不包含其他字段,是可以的

{"wildcardProjection": {"attributes": 0,"_id": 1}
}

在products集合添加索引,包含attributes文档中的size和color字段

db.products.createIndex({"$**": 1
}, {wildcardProjection: {"attributes.colors": 1,"attributes.size": 1}  
}) 

在products集合添加索引,不包含attributes文档中的memory字段

db.products.createIndex({"$**": 1
}, {wildcardProjection: {"attributes.memory": 0}  
}) 

在集合的所有字段上添加索引

添加集合artwork并插入数据

db.artWork.insertMany([{title: "The Scream",artist: "Edvard Munch",year: 1893,medium: "oil on canvas",dimensions: {height: 91,width: 73}}, {title: "The Persistence of Memory",artist: "Salvador Dali",year: 1931,medium: "oil on canvas",dimensions: {height: 24,width: 33}}
])

为所有字段添加索引

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

查询数据

db.artWork.find({"year": 1931})
db.artWork.find({"dimensions.height": {$gt: 30}})

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

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

相关文章

代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?

代理IP协议是一种网络代理技术&#xff0c;可以实现隐藏客户端IP地址、加速网站访问、过滤网络内容、访问内网资源等功能。常用的IP代理协议主要有Socks5代理、HTTP代理、HTTPS代理这三种。代理IP协议主要用于分组交换计算机通信网络的互联系统中使用&#xff0c;只负责数据的路…

python-基础篇-字符串-是什么

文章目录 定义一&#xff1a;所谓字符串&#xff0c;就是由零个或多个字符组成的有限序列&#xff0c;在Python程序中&#xff0c;如果我们把单个或多个字符用单引号或者双引号包围起来&#xff0c;就可以表示一个字符串。字符串和常用数据结构使用字符串 通过多个角度的定义了…

开局一个启动器:从零开始入坑ComfyUI

前几天刷某乎的时候看到了一位大佬写的好文&#xff0c;可图 IP-Adapter 模型已开源&#xff0c;更多玩法&#xff0c;更强生态&#xff01; - 知乎 (zhihu.com) 久闻ComfyUI大名&#xff0c;决定试一下。这次打算不走寻常路&#xff0c;不下载现成的一键包了&#xff0c;而是…

let、var、const 的区别 --js面试题

作用域 ES5中的作用域有&#xff1a;全局作用域、函数作用域&#xff0c;ES6中新增了块级作用域。块作用域由 { } 包括&#xff0c;if 语句和 for 语句里面的 { } 也属于块作用域。 var 1.没有块级作用域的概念&#xff0c;但具有函数全局作用域、函数作用域的概念 {var a …

【凸优化】二次约束二次规划(QCQP)问题转化为二阶锥规划(SOCP)

二次约束二次规划&#xff08;QCQP&#xff09;问题的SOCP形式转化 1. 问题描述 1.1. QCQP的一般形式&#xff1a; min ⁡ 1 2 x ⊤ Q 0 x c ⊤ x s . t . x ⊤ Q i x a i ⊤ x ≤ b i , i 1 , … , m \begin{aligned} \min \quad &\frac{1}{2}\mathbf{x}^{\top}\math…

移除链表元素 - 力扣(LeetCode)

203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* cur hea…

ubuntu c++ nginx ffmpeg 推流海康摄像头视频

环境&#xff1a;Ubuntu18.04 使用到的库&#xff1a;nginx&#xff0c;ffmpeg 外设&#xff1a;海康任一款摄像头&#xff0c;分辨率&#xff1a;1280*720 Ubuntu c 海康sdk获取原始码流&#xff0c;使用ffmpeg编码推流到nginx服务器&#xff0c;使用vlc即可拉到rtmp图像&a…

别再只知道埋头苦学python了!!学了python后月入1w不在话下,不准你还不知道!!!

在Python接单的过程中&#xff0c;掌握一些技巧、注意相关事项以及选择合适的接单平台是非常重要的 一、Python接单要注意哪些 报酬问题&#xff1a;在接单前&#xff0c;务必明确客户所说的报酬是税前还是税后&#xff0c;以避免后期产生纠纷。时间管理&#xff1a;不要与客户…

Nginx 如何处理 WebSocket 连接?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 如何处理 WebSocket 连接&#xff1f;一、WebSocket 连接简介二、Nginx 处理 WebSocket 连接的基本原理三、配置 Nginx 支持 WebSocket 连接四、Nginx 中的…

【启明智显分享】甲醛检测仪HMI方案:ESP32-S3方案4.3寸触摸串口屏,RS485、WIFI/蓝牙可选

今年&#xff0c;“串串房”一词频繁引发广大网友关注。“串串房”&#xff0c;也被称为“陷阱房”“贩子房”——炒房客以低价收购旧房子或者毛坯房&#xff0c;用极度节省成本的方式对房子进行装修&#xff0c;之后作为精修房高价租售&#xff0c;因甲醛等有害物质含量极高&a…

LeetCode-day23-3098. 求出所有子序列的能量和

LeetCode-day23-3098. 求出所有子序列的能量和 题目描述示例示例1&#xff1a;示例2&#xff1a;示例3&#xff1a; 思路代码 题目描述 给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。 一个 子序列的 能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。 请…

“从爱好者到职业画师:一位AI绘画践行者的赚钱实战秘籍“

&#x1f3a8; 【引子&#xff1a;AI绘画&#xff1a;艺术与科技的交汇】 在数字化浪潮席卷全球的今天&#xff0c;人工智能技术以其颠覆性的力量&#xff0c;正悄然改写着艺术创作的传统版图。当AI与绘画碰撞交融&#xff0c;诞生出一种全新的艺术形式——AI绘画。它不仅是科…

别只盯着苹果了,华为Mate70也有AI技术,听说效果让人直接惊呼

随着人工智能技术的不断进步&#xff0c;智能手机行业也迎来了前所未有的变革。苹果、三星等国际知名手机厂商纷纷在新品发布会上重点展示其手机的AI技术&#xff0c;而华为作为中国科技的领军企业&#xff0c;其在AI领域的成就同样不容小觑。 华为Mate系列作为其旗舰系列&…

科研绘图系列:R语言组合热图和散点图

介绍 热图展示参与者的属性,散点图表示样本的时间跨度。 加载R包 library(tidyverse) library(ComplexHeatmap) library(circlize) library(cowplot)导入数据 数据可从以下链接下载(画图所需要的所有数据): 百度云盘链接: https://pan.baidu.com/s/1iEE9seTLdrrC3WDHJy…

计算机网络基础:3.DNS服务器、域名分类

一、DNS服务器 DNS服务器在网络中的作用类似于餐厅中的“顾客座位对照表”&#xff0c;它帮助前台&#xff08;路由器&#xff09;将顾客&#xff08;用户&#xff09;的请求转发到正确的餐桌&#xff08;目标设备&#xff09;。 (1)概念与原理 DNS的基本概念 DNS&…

ansible的role用法

目录 目录结构介绍案例 目录结构介绍 可以通可以通过使用 ansible-galaxy 命令再当前目录自动生成 role 的基本目录结构。 myrole为文件名&#xff08;角色名&#xff09; ansible-galaxy init myrole如果没有安装Ansible Galaxy&#xff0c;你可以使用以下命令安装&#xff…

Gson的基本使用:解析Json格式数据 序列化与反序列化

目录 一&#xff0c;Gson和Json 1&#xff0c;Gson 2&#xff0c;Json 3&#xff0c;Gson处理对象的几个重要点 4&#xff0c;序列化和反序列化 二&#xff0c;Gson的使用 1&#xff0c;Gson的创建 2&#xff0c;简单对象序列化 3&#xff0c;对象序列化&#xff0c;格…

C++学习笔记-友元函数的定义与使用

一、引言 在C中&#xff0c;友元函数&#xff08;Friend Function&#xff09;是一个独特而强大的特性&#xff0c;它打破了类的封装性&#xff0c;允许一个或多个非成员函数访问类的私有&#xff08;private&#xff09;和保护&#xff08;protected&#xff09;成员。尽管这…

Springboot+Maven多模块项目开发

SpringbootMaven多模块项目开发 前言示例项目建设Parent项目Common模块ModuleOne模块特别说明 参考&#xff1a; 前言 1.多模块项目的好处&#xff1a; 代码复用 一个后端项目的entity、dao、service代码需要用到前端服务&#xff0c;还需要用到后台管理&#xff0c;通过多模…

Wordpress安装到win10(2024年7月)

目录 1.wordpress介绍 2下载应用 2.1.wordpress 2.2XAMPP 2.3 PHPmyadmin 3.配置应用 3.1XAMPP进程 3.2 文件配置 3.3 phpmyadmin配置 4.配置网页 4.1 数据库创建 4.2 安装wordpress 5.进入面板 6.总结 1.wordpress介绍 WordPress是一个开源内容管理系统&#xff0…