百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

MongoDB的10种索引,你了解的有几个?

itomcoil 2025-02-24 16:48 14 浏览

为什么要有索引??

查询快! 查询快! 查询快!

MongoDB的10种索引?

创建索引语法:

db..createIndex(?,??)

我们的record Collection存在如下document

{
??"_id":?ObjectId("570c04a4ad233577f97dc459"),
??"score":?1034,
??"userId":?123,
??"location":?{?state:?"ZH",?city:?"ChengDu"?},
??"addr":?[
????{zip:?"10036",?detail:?"高家村五组"},
????{zip:?"94231",?detail:?"王家镇三组701"}
??]
}

_id索引

mongodb会自动为document中的_id字段加上索引,所以能用_id查询就用_id查询

单键索引

db.records.createIndex(?{?score:?1?})

复合索引

db.records.createIndex(?{?userId:?1,?score:?1})

多值索引

db.records.createIndex(?{?"addr.zip":?1?})

地理空间索引

MongoDB为坐标平面查询提供了专门的索引,称为地理空间索引。这种查询需要两个维度,所以参数是2d。

db.map.ensureIndex({"gps"?:?"2d"});

gps键的值必须是某种形式的一对值:一个包含2个元素的数组或者是包含2个键的内嵌文档

{"gps"?:?[0,100]}
{"gps"?:?{"x"?:?-30?,?"y"?:?30}}
{"gps"?:?{"latitude"?:?-180,?"longitude"?:?180?}}

至于键名可以随意。默认情况下,地理空间索引假设值范围是-180~180(对经纬度来说很方便),我们同样可以使用参数来对索引进行定制,比如下面的星图

db.star.trek.ensureIndex({"light-years"?:?"2d"}?,?{"min"?:?-1000,?"max"?:?1000,?bits;10},?{collation:?{locale:?"simple"}});

上面的bits指定的是索引精度,默认情况下2d index使用的是26位精度,在默认范围-180~180中,大约等于60cm误差,最大可以设置32位精度。索引精度不影响查询精度,降低精度的优点是插入操作的处理开销较低,并且占用的空间更少。较高精度的优点是查询扫描索引的较小部分以返回结果。

collation(排序规则)允许用户为字符串比较指定特定于语言的规则,例如字母和重音符号的规则。

地理空间的查询需要$near,它需要两个目标值的数组作为参数

db.map.find({"gps"?:?{"$near"?:?[40,-73]}}).limit(10);

默认查100个文档,如果不需要这么多,就应该设置一个少点的值以节约资源。

还可以使用

db.runCommand({geoNear?:?"map",?near:?[40,-73],num?:?10})

geoNear的方式会返回每个文档到查询点的距离。

还可以查询矩形和圆形内所有的点,这个时候就要将原来的$near换成$geoWithin .对于矩形要使用$box选项,它的参数是2个元素的数组,第一个元素指定了左下角坐标,第二个指定了右上角坐标

db.map.find({"gps"?:?{"$geoWithin?"?:?{"$box"?:?[[10,20],[15,30]]}}});

如果要查询圆形,则要使用$center,参数变成了圆心和半径

db.map.find({"gps"?:?{"$geoWithin?"?:?{"$center"?:?[[12,25],5]}}});

地理空间查询既可以使用平面几何,也可以使用球面几何,根据使用的查询和索引类型来决定。 2dsphere 索引只能支持球面几何,而 2d索引同时支持平面和球面几何。然而,在 2dsphere索引上使用球面几何的查询将会更高效和准确。

2dsphere : https://docs.mongodb.com/manual/core/2dsphere/

它的应用场景可以是 查找附近美食,查找附近停车场等数据。

全文索引

创建索引:

db..createIndex({:?"text"});

查询数据:

db..find(?{?$text:?{?$search:?"green"?}?}?);

查询以及排序:

db..find(
{
?"$text":?{
????"$search":?"green"
??}
},
{
??"textScore":?{
????"$meta":?"textScore"
??}
}
).sort({
??"textScore":?{
????"$meta":?"textScore"
??}
})

注意这里的textScore并不是集合中的某个字段,而是mongodb根据搜索结果计算该条数据的分数(匹配度预告,值越大)

TTL索引

我在之前的文章讲到过这个索引,它实际上是一个具有生命周期的索引,这种索引允许为每一个文档设置一个超时时间。一个文档达到预设置的老化程度后就会被删除。

db.user_session.createIndex({"updated":1},{expireAfterSeconds:60*60*24});

如果一个文档的updated字段存在并且它的值是日期类型,当服务器时间比文档的updated字段的时间晚expireAfterSeconds秒时,文档就会被删除

db.getCollection('user_session').insert(
??{
????_id:?NumberInt(1),
????"updated":new?Date(),
?????username:'lisi'
??}
);

部分索引

db..createIndex(
{'wechat':?1?},
{
??"partialFilterExpression":?{
????"wechat":?{
??????"$exists":?true
????}
??}
}
)

上面的索引表示对存在wechat字段的文档进行索引。部分索引仅索引集合中符合指定过滤器表达式的文档,降低了索引创建和维护的性能成本。

部分索引提供了稀疏索引功能的超集,应优先于稀疏索引使用

稀疏索引

db.addresses.createIndex(?{?"xmpp_id":?1?},?{?sparse:?true?}?)

索引不索引不包含xmpp_id字段的文档。

哈希索引

db.collection.createIndex(?{?_id:?"hashed"?})

哈希索引指按照某个字段的hash值来建立索引,目前主要用于MongoDB Sharded Cluster的Hash分片,hash索引只能满足字段完全匹配的查询,不能满足范围查询

后台方式创建索引

db..createIndex(?,?{background:?true})

建立索引即耗时也费力,还需要消耗很多资源。使用{background: true}选项可以使这个过程在后台完成,同时正常处理请求。要是不包括这个选项,数据库会阻塞建立索引期间的所有请求。阻塞的做法会让索引建立得更快,同时也意味着应用在此期间不能应答。即便后台进行也会对正常操作有些影响,所以最好选在无关紧要的时刻。后台创建索引也会增加负载,好在不会让服务器宕机。

不过从4.2版本开始,所有索引构建都使用优化的构建过程,该过程仅在构建过程的开始和结束时才持有排他锁。其余的构建过程将产生交错的读写操作。如果指定该属性,MongoDB将忽略这个选项。


作者:think123
原文链接:
https://juejin.im/post/5e854f236fb9a03c563c02ee

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...