Mongodb的通配符索引

news2024/9/20 16:41:38

学习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.coloradmin.cn/o/1945528.html

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

相关文章

Blender 4.2 安装GIS插件步骤

Blender 4 更新以后插件安装变得复杂&#xff0c;插件界面的安装按钮不显示&#xff0c;界面布局改变&#xff0c;怎么安装插件&#xff1a; 1. 在线安装&#xff1a; “编辑”&#xff08;Edit&#xff09;>进入偏好设置&#xff08;Preferences setting&#xff09;>…

文件粉碎销毁 硬盘粉碎销毁 废弃的文件如何销毁

废弃的文件可以采用多种方法进行销毁&#xff0c;具体取决于文件的敏感性和数量。以下是一些常见的废弃文件销毁方法&#xff1a; 1. 机械粉碎&#xff1a;这是一种常见的方法&#xff0c;尤其适用于含有敏感信息的文件。可以使用碎纸机将文件切碎&#xff0c;对于小批量的资料…

Python新手如何制作植物大战僵尸?这篇文章教会你!

引言 《植物大战僵尸》是一款非常受欢迎的塔防游戏&#xff0c;玩家需要种植各种植物来抵御僵尸的进攻。在这篇文章中&#xff0c;我们将使用Python编写一个简化版的植物大战僵尸游戏&#xff0c;以展示如何使用Python创建游戏。 游戏规则 玩家将种植不同类型的植物来防御僵尸…

微软“蓝屏”事件:对全球IT基础设施韧性与安全性的深刻反思

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

【ai】windows ollama安装qwen

可以直接github下载,或者官方网站下载:参考大神的介绍当前最新0.28安装windows的预览版本,出现一个服务? 直接跑会TLS超时? 配置代理 export https_proxy=http://192.168.50.65:7890 export http_proxy

JavaWeb笔记_Session

Session概述 Session是一种在服务端记录用户会话信息的技术 Session的创建和获取 /*** HttpServletRequest对象中的方法:* public HttpSession getSession()* 如果当前服务端没有session,那就在服务端新建一个session对象* 如果在服务端有这个session,那么就直…

【C++】类和对象之继承

目录 继承的概念和定义 继承的概念 继承的定义 继承的定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 访问权限实例 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 继承的…

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

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

nacos get changed dataId error, code: 403

nacos get changed dataId error, code: 403问题解决 问题出现原因&#xff1a;解决办法&#xff1a;需要在运行项目的配置添加权限账号和密码,重启服务 问题出现原因&#xff1a; 由于nacosserver开启了权限验证&#xff0c;项目启动时出现异常 nacos.core.auth.caching.ena…

Java基础06:变量,常量,作用域(狂神说Java)

一.变量 有了static&#xff0c;即类变量&#xff0c;就可以不用new了可以直接调用&#xff0c;类变量之后再细讲 二.常量 三.变量的命名规范

权限(linux)

权限就是文件权限&#xff08;linux万物皆文件&#xff09; 本文主要涉及文件/文件夹权限 涉及指令&#xff1a; shell&#xff1a; kernal &#xff1a; linux内核 shell &#xff1a; 外壳 shell可以方便交互与操作 bash是一个具体的shell su su 切换用户 su -root 变…

AppInventor导入导出项目以及打包apk安装包

AppInventor导入导出项目以及打包apk安装包 1.概述 当项目开发好了之后&#xff0c;如果想将项目分享给其他人&#xff0c;或者导入其他人开发的项目怎么办那。 如果给其他人安装你的项目&#xff0c;如何安装那&#xff1f; 2.自带导出和导入功能 导出项目&#xff0c;在P…

【网络】tcp_socket

tcp_socket 一、tcp_server与udp_server一样的部分二、listen接口&#xff08;监听&#xff09;三、accept接收套接字1、为什么还要多一个套接字&#xff08;明明已经有了个socket套接字文件了&#xff0c;为什么要多一个accept套接字文件&#xff1f;&#xff09;2、底层拿到新…

基于VMware(虚拟机) 创建 Ubunton 24.04

目录 1. 设置网络 1. 在安装ubuntu时设置网络 2.在配置文件中修改 2.设置 root 密码 3. 防火墙设置 1 安装防火墙 2 开启和关闭防火墙 3 开放端口和服务规则 4 关闭端口和删除服务规则 5 查看防火墙状态 4. 换源 1. 在创建的时切换源 2.修改源配置 1、Ubuntu24.04 …

MBR60200PT-ASEMI无人机专用MBR60200PT

编辑&#xff1a;ll MBR60200PT-ASEMI无人机专用MBR60200PT 型号&#xff1a;MBR60200PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 批号&#xff1a;最新 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;60A 最大循环峰值反向…

学习华为IPD流程黑话2.0

目录 1、内容简介 2、概念六&#xff1a;管道管理 3、概念七&#xff1a;业务计划 4、概念八&#xff1a;IPMT 的投资活动 5、概念九&#xff1a;BETA、ESS、ESP 作者简介 1、内容简介 学习任何新事物都是从概念开始的。 以我个人最近遇到的一个事为例&#xff1a; 前…

TCP三次握手和四次挥手的理解

三次握手 第一次握手&#xff1a; 客户端发出 请求报文其中SYN应1&#xff0c;选择一个序列号x 第二次握手&#xff1a; 服务端接收到之后回复 确认报文&#xff0c;其中SYN应1&#xff0c;ACK1&#xff0c;确认号是x1&#xff0c;同时为自己初始化序列号y 第三次握手&…

uboot的mmc partconf命令

文章目录 命令格式参数解释具体命令解释总结 mmc partconf 是一个用于配置 MMC (MultiMediaCard) 分区的 U-Boot 命令。具体来说&#xff0c;这个命令允许你设置或读取 MMC 卡的分区配置参数。让我们详细解释一下 mmc partconf 0 0 1 0 命令的含义。 命令格式 mmc partconf &…

go语言day15 goroutine

Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master rubyhan1314/Golang-100-Days GitHub 第2讲-调度器的由来和分析_哔哩哔哩_bilibili 一个进程最多可以创建多少个线程&#xff1f;-CSDN博客 引入协程 go语言中内置了协程goroutine&#…

使用水星Mecury人形机器人搭建VR遥操作控制平台!

VR遥操作机械臂是一种将虚拟现实技术与机械臂控制相结合的系统&#xff0c;使用户可以通过虚拟现实设备操控和交互实际的机械臂。这种技术可以应用于多个领域&#xff0c;包括远程操作、培训、危险环境中的工作等。 双臂人形机器人是一种模拟人体上半身结构&#xff0c;包括头部…