【MongoDB学习笔记23】MongoDB的索引对象和数组
admin
2023-04-12 10:03:53
0次

MongoDB允许深入文档内部,对嵌套字段和数组建立索引;嵌套对象和数组字段可以和复合索引中的顶级字段一起使用,多数情况下与“正常”索引字段的行为也是一致的。

 

一、索引嵌套文档

例如,集合中的文档如下格式,

> db.post.findOne({"username":"sid"})   
{    
    "_id" : ObjectId("54aff7f43bd1048e7b585e39"),    
    "username" : "sid",    
    "loc" : {    
        "ip" : "1.2.3.4",    
        "city" : "springfield",    
        "state" : "ny"    
    }    
}    
>

需要在“loc”的city上建立索引来提高这个loc.city字段的查询速度:

> db.post.ensureIndex({"loc.city":1})   
{    
    "createdCollectionAutomatically" : false,    
    "numIndexesBefore" : 1,    
    "numIndexesAfter" : 2,    
    "ok" : 1    
}    
>

利用这种方式可以建立任意深度的索引,例如可以在X.Y.Z.A.B.C上建立索引。

但是,针对子文档“loc”上建立的索引,和建立在子文档的某个字段“loc.city”上的索引是不同的:

(1)对整个子文档上建立的索引,只会提高整个子文档的的查询速度;也就是说只有在完全匹配子文档的查询(包括字段顺序),子文档索引才会起作用;

(2)只有查询loc.city字段,索引loc.city才会起作用,其他情况索引loc.city不起作用;

 


二、数组上的索引

(1)可以看得出在数组字段上建立索引的代价比较大,因为每次的删除,更新都会对每一个索引进行刷新,太消耗服务器的资源;

(2)可以针对数组字段中的某一个元素做具体的单独索引,减少索引的数量;例如,在数组字段comments中的第九个元素中的votes上建立索引:

> db.post.ensureIndex({"comment.10.votes":1})

同样,只有精确匹配comment.10.votes查询,上述索引才会起到索引的作用。

 

三、多键索引

如果在数组字段上创建索引,那么这个索引称为多键索引( multikey)。

多键索引用explain函数中可以看到“isMultikey”字段的值为true,多键索引比非多键索引要慢一些;



相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...