MongoDB索引

索引支持在MongoDB中高效执行查询。如果没有索引,MongoDB必须扫描集合中的每个文档才能返回查询结果。如果查询存在适当的索引,MongoDB将使用该索引来限制它必须扫描的文档数。
尽管索引提高了查询性能,但添加索引对写入操作的性能有负面影响。对于具有高读写比率的集合,索引是昂贵的,因为每次插入都必须更新任何索引。

一、用例

如果应用程序在相同的字段上重复运行查询,则可以在这些字段上创建索引以提高性能。例如,考虑以下场景:

Scenario

Index Type

人力资源部门通常需要按员工ID查找员工。您可以在员工ID字段上创建索引,以提高查询性能。

Single Field Index

销售人员通常需要按位置查找客户信息。位置存储在一个嵌入的对象中,其中包含州、城市和邮政编码等字段。可以在整个位置对象上创建索引,以提高该对象中任何字段的查询性能。

Single Field Index on an object

杂货店经理通常需要按名称和数量查找库存项目,以确定哪些项目库存不足。您可以在项目和数量字段上创建单个索引,以提高查询性能。

Compound Index

二、Details

索引是特殊的数据结构,以易于遍历的形式存储集合数据集的一小部分。MongoDB索引使用B树数据结构。
索引存储特定字段或字段集的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB可以使用索引中的顺序返回排序的结果。

三、限制

某些限制适用于索引,例如索引键的长度或每个集合的索引数。有关详细信息,请参阅索引限制。

四、默认索引

MongoDB在创建集合期间在_id字段上创建唯一索引。_id索引防止客户端插入两个文档,其中_id字段的值相同。不能删除此索引。

五、索引名称

索引的默认名称是索引键和索引(1或-1)中每个键的方向的串联,使用下划线作为分隔符。例如,在{item:1,quantity:-1}上创建的索引的名称为item_1_quantity_-1。
索引一旦创建就不能重命名。相反,必须删除索引,然后用新名称重新创建索引。

六、Create an Index

索引支持在MongoDB中高效执行查询。如果应用程序在相同的字段上重复运行查询,则可以在这些字段上创建索引,以提高这些查询的性能。
要创建索引,请使用createIndex()shell方法或驱动程序的等效方法。本页显示MongoDB Shell和驱动程序的示例。

1、关于此任务

在MongoDB Shell或驱动程序中运行创建索引命令时,MongoDB仅在不存在相同规范的索引时创建索引。
尽管索引提高了查询性能,但添加索引对写入操作的性能有负面影响。对于具有高读写比率的集合,索引是昂贵的,因为每次插入和更新都必须更新任何索引。

2、Procedure

要设置此页面上示例的语言,请使用右侧导航窗格中的选择语言下拉菜单。

要使用Async Java驱动程序创建索引,请使用com.mongodb.Async.client.MongoCollection.createIndex。

collection.createIndex( <key and index type specification>, <options>, <callbackFunction>)

本例在名称字段上创建单键降序索引:

collection.createIndex(Indexes.descending("name"), someCallbackFunction());db.blog.createIndex({content: "text","users.comments": "text","users.profiles": "text"},{name: "InteractionsTextIndex"}
)

结果要确认索引已创建,请使用mongosh运行db.collection.getIndexes()方法:

db.collection.getIndexes()

输出:

[{ v: 2, key: { _id: 1 }, name: '_id_' },{ v: 2, key: { name: -1 }, name: 'name_-1' }
]

3、指定索引名称

创建索引时,可以为索引指定自定义名称。为索引命名有助于区分集合上的不同索引。例如,如果索引具有不同的名称,则可以更容易地在查询计划的解释结果中标识查询使用的索引。
要指定索引名称,请在创建索引时包含名称选项:

db.<collection>.createIndex({ <field>: <value> },{ name: "<indexName>" }
)

默认索引名称
如果在创建索引期间未指定名称,则系统通过用下划线连接每个索引键字段和值来生成名称。例如:

Index

Default Name

{ score : 1 }

score_1

{ content : "text", "description.tags": "text" }

content_text_description.tags_text

{ category : 1, locale : "2dsphere"}

category_1_locale_2dsphere

{ "fieldA" : 1, "fieldB" : "hashed", "fieldC" : -1 }

fieldA_1_fieldB_hashed_fieldC_-1

4、Drop an Index

可以从集合中删除特定索引。如果看到对性能的负面影响、希望用新索引替换它或不再需要索引,则可能需要删除索引。
要删除索引,请使用以下shell方法之一:

Method

Description

db.collection.dropIndex()

从集合中删除特定索引。

db.collection.dropIndexes()

删除索引集合或索引数组中的所有可移动索引(如果指定)。

5、Index Types

此页面描述可以在MongoDB中创建的索引类型。不同的索引类型支持不同类型的数据和查询。

Single Field Index

单字段索引从集合中每个文档的单个字段中收集和排序数据。
此图显示单个字段上的索引,分数:

复合索引
复合索引收集和排序来自集合中每个文档中两个或多个字段的数据。数据按索引中的第一个字段分组,然后按每个后续字段分组。
例如,下图显示了一个复合索引,其中文档首先按用户ID按升序(字母顺序)分组。然后,每个用户ID的分数按降序排序: 

多键索引
多键索引收集和排序存储在数组中的数据。
不需要显式指定多键类型。在包含数组值的字段上创建索引时,MongoDB会自动将索引设置为多键索引。
此图显示addr.zip字段上的多键索引: 

地理空间索引
地理空间索引提高了查询地理空间坐标数据的性能。要了解更多信息,请参见地理空间索引。
MongoDB提供两种类型的地理空间索引: 

  • 使用平面几何图形返回结果的2d索引。
  • 使用球形几何体返回结果的2dsphere索引。

文本索引
文本索引支持对包含字符串内容的字段进行文本搜索查询。 

哈希索引
哈希索引支持哈希切分。哈希索引索引字段值的哈希。

聚集索引
5.3版中的新增功能。
聚集索引指定聚集集合存储数据的顺序。使用聚集索引创建的集合称为聚集集合。

七、Create a Compound Index

复合索引是包含对多个字段的引用的索引。复合索引提高了对索引中的字段或索引前缀中的字段进行精确查询的性能。
要创建复合索引,请使用db.collection.createIndex()方法:

db.<collection>.createIndex( {<field1>: <sortOrder>,<field2>: <sortOrder>,...<fieldN>: <sortOrder>
} )

1、限制

在单个复合索引中最多可以指定32个字段。

开始之前
创建包含以下文档的学生集合:

db.students.insertMany([{"name": "Alice","gpa": 3.6,"location": { city: "Sacramento", state: "California" }},{"name": "Bob","gpa": 3.2,"location": { city: "Albany", state: "New York" }}
])

2、Procedure

以下操作创建包含名称和gpa字段的复合索引:

db.students.createIndex( {name: 1,gpa: -1
} )

在此示例中:

  • 名称上的索引是升序的(1)。
  • gpa上的索引正在下降(-1)。

3、Results 

创建的索引支持选择以下项的查询:

  • 名称和gpa字段。
  • 仅名称字段,因为名称是复合索引的前缀。

例如,索引支持以下查询:

db.students.find( { name: "Alice", gpa: 3.6 } )db.students.find( { name: "Bob" } )

 

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

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

相关文章

怎么去营造地中海风格?进来来看看吧

什么是地中海风格&#xff1f; 地中海风格是一种受地中海沿岸住宅建筑和美学影响的装饰风格。西班牙、希腊和摩洛哥等国的文化对地中海风格产生了影响。 简约是地中海生活的主要部分。地中海气候宜人&#xff0c;人们的生活态度闲适&#xff0c;这一点在色彩、设计、材料和图案…

2023第十二届中国智能产业高峰论坛之文档大模型的探索与思考

文章目录 前言合合信息多模态大模型与文档图像智能理解文档图像分析识别与理解的技术难题文档图像分析与预处理文档解析与识别版面分析与还原文档信息抽取与理解AI安全知识化&存储检索和管理 文档图像的分析识别与理解和大模型的关系文档图像大模型的进展LayoutLMUDOPDonut…

东郊到家app小程序公众号软件开发预约同城服务系统成品源码部署

东郊到家app系统开发&#xff0c;东郊到家软件定制开发&#xff0c;东郊到家小程序APP开发&#xff0c;东郊到家源码定制开发&#xff0c;东郊到家模式系统定制开发 一、上门软件介绍 1、上门app是一家以推拿为主项&#xff0c;个人定制型的o2o平台&#xff0c;上门app平台提…

次时代摸鱼骚操作:人在办公室轻松观看家里电脑上的4k电影(移动端公网访问本地群辉存储视频文件)

如何使用iPhone15在办公室观看家里电脑上的4k电影&#xff1f; 文章目录 如何使用iPhone15在办公室观看家里电脑上的4k电影&#xff1f;1.使用环境要求&#xff1a;2.下载群晖videostation&#xff1a;3.公网访问本地群晖videostation中的电影&#xff1a;4.公网条件下使用电脑…

详解MySQL索引+面试题

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。 😇😇😇有兴趣的话关注博主一起学习,一起进步吧! 一、索引概述…

购物新时尚RFID自助结账

购物已经变得更加简单和方便了&#xff0c;归功于RFID自助结账。别再排队等收银员了&#xff0c;让我们来看看这个酷炫的新方式。 RFID是什么&#xff1f;RFID就是那些小电子标签&#xff0c;它们能够让物品自动被识别。每个商品都有一个这样的标签&#xff0c;而RFID读卡器就…

【Linux is not Unix】Linux前言

目录 二战军工的产物——第一台现代电子数字计算机ENIAC&#xff08;埃尼阿克&#xff09; Unix Linux Linux企业应用现状 如今计算机已经应用在我们生活的各个层面&#xff0c;像我们日常使用的笔记本是计算机的一类&#xff0c;可以解决我们生活中遇到的很多问题&#xff…

视频监控系统/视频汇聚平台EasyCVR有下级平台注册时出现断流情况该如何排查解决?

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…

论文阅读:AugGAN: Cross Domain Adaptation with GAN-based Data Augmentation

Abstract 基于GAN的图像转换方法存在两个缺陷&#xff1a;保留图像目标和保持图像转换前后的一致性&#xff0c;这导致不能用它生成大量不同域的训练数据。论文提出了一种结构感知(Structure-aware)的图像转换网络(image-to-image translation network)。 Proposed Framework…

【渗透攻防】千变万化的WebShell

前言 WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境&#xff0c;也可以将其称做为一种网页后门。本篇文章将带大家学习如何获取WebShell&#xff0c;如何隐藏WebShell&#xff0c;有攻必有防&#xff0c;最后带大家学习查杀WebShell。 目录 第一节…

Opencv cuda版本在ubuntu22.04中安装办法,解决Could NOT find CUDNN的办法

文章目录 概要下载cuda的runfile版本配置环境变量官网下载cudann安装Opencv依赖包下载opencv和opencv_contrib并解压准备编译安装anaconda环境执行编译命令安装OpenCV并检查是否安装成功 概要 解决以下安装问题&#xff1a; -- Could NOT find CUDNN: Found unsuitable versi…

Qt地铁智慧换乘系统浅学( 一 )存储站点,线路信息

存储 定义所需要的容器定义最大最小经纬度[统计站点信息 在经纬度网站](https://map.jiqrxx.com/jingweidu/)读取统计的信息存储到容器其他的一些相关函数debug 显示存储的信息更新最小最大经纬度的函数获取两点之间的距离 根据经纬度 定义所需要的容器 extern QMap<QStrin…

单元测试 —— JUnit 5 参数化测试

JUnit 5参数化测试 目录 设置我们的第一个参数化测试参数来源 ValueSourceNullSource & EmptySourceMethodSourceCsvSourceCsvFileSourceEnumSourceArgumentsSource参数转换参数聚合奖励总结 如果您正在阅读这篇文章&#xff0c;说明您已经熟悉了JUnit。让我为您概括一下…

Web 基础概念

自己总结的web前端知识体系大全 基础概念 DOM DOM是什么意思-前端入门_dom是什么意思啊_猿说前端的博客-CSDN博客 DOM的含义&#xff1a; DOM称为文件对象模型&#xff08;DocumentObjectModel&#xff0c;简称DOM&#xff09;&#xff0c;是W3C组织推荐的处理可扩展置标语言的…

hanoi塔问题

汉诺塔 5层攻略31步_哔哩哔哩_bilibili 问题描述&#xff1a; n阶Hanoi塔问题&#xff0c;假设有3个分别命名为A、B、C塔座&#xff0c;在塔座A上插有n个直径大小各不相同、依小到大的圆盘。现要求将A轴上的n个圆盘移动至塔座C上并按同样顺序叠排&#xff0c;圆盘移动时必须遵…

【Linux】生产消费模型 + 线程池

文章目录 &#x1f4d6; 前言1. 生产消费模型2. 阻塞队列2.1 成员变量&#xff1a;2.2 入队(push)和出队(pop)&#xff1a;2.3 封装与测试运行&#xff1a;2.3 - 1 对代码进一步封装2.3 - 2 分配运算任务2.3 - 3 测试与运行 3. 循环阻塞队列3.1 POSIX信号量&#xff1a;3.1 - 1…

VRRP DHCP ACL NAT 网络核心路由技术综述 (第十课)

VRRP DHCP ACL NAT 网络核心技术综述 (第十课) 六大路由基础技术 简单的利用思维导图回顾 1 浮动路由 2 VRRP 技术==>目的是备份网关

阿里云Stable Diffusion操作教程

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 前言 Stable Diffusion是⼀种深度学习模型,主要⽤于将⽂本描述转化为详细的图像,也可以应⽤于其他图像处理任务 。 这个模型由创业公司Stability AI 与学术研究者合作开发,使⽤了⼀种称为潜在扩散模型(LDM)的扩散模型…

基于UWB技术高精度人员定位系统源码

一、UWB定位技术有什么优势&#xff1f; UWB技术解决了困扰传统无线通信技术多年的有关传播方面的重大难题&#xff0c;具有对信道衰落不敏感、发射信号功率谱密度低、截获率低、系统复杂度低、能提供数厘米的定位精度等优点。 1.系统结构简单 UWB系统中的发射器直接用脉冲小…

28.CSS 渐变圆文本动画

效果 源码 index.html <!doctype html> <html> <head><meta charset="utf-8"><title>Glowing Gradient Circle Text Animation</title><link rel="stylesheet" href="style.css"> </head> &l…