MongoDB学习(三)索引

查看集合中的索引的方法

db.students.getIndexes();默认创建集合的时候会建立一个索引名称为_id_的索引。

索引的自动命名的规则是字段名称加上_下划线,也可以自己创建一个索引

索引key值为1则是升序,-1为降序

创建一个索引

 db.students.ensureIndex({"age":-1})在age字段上面建立一个索引,降序的索引

db.students.find({"age":{"$gt":18}}).explain("executionStats");

IXSCAN说明使用的是索引查询。

 db.students.find({"$or":[{"age":{"$gt":18}},{"score":{"$gt":60}}]}).explain("executionStats");

此时查询为全表查询,查询的次数为9次,查询返回的数据为8条。现在我们用复合的索引来优化一下

创建一个复合索引

运行 db.students.find({"$or":[{"age":{"$gt":18}},{"score":{"$gt":60}}]}).explain("executionStats");没有变化,因此这个索引没有起作用,此时就要用到hint()强制使用索引的函数

 db.students.find({"$or":[{"age":{"$gt":18}},{"score":{"$gt":60}}]}).explain("executionStats");

看了一下分析的数据使用了索引,但是查询的文档数量和没有使用索引是一样的。因此此时的索引没有起作用。

实际的开发中索引的使用是要经过测试来决定是否使用索引,有时候索引的使用会使得效率更低,或者没有变化。

删除索引

删除单个:

db.集合名称.dropIndex({"age":-1,"score":-1});

删除所有的非"_id_"的索引

db.集合名称.dropIndexes();

唯一索引

 db.students.ensureIndex({"name":-1},{"name":"name_-1"},{"unique":true})

设置unique为true便可以创建一个唯一的索引

插入重复name的数据,报错。

E11000 duplicate key error collection: mldn.students index: name_1 dup key错误的信息提示

过期索引

一些只保存小段时间的信息,便可以用过期索引。但是过期索引的时间不是很准确。

db.phones.ensureIndex({"time":1},{"expireAfterSeconds":10})

创建过期索引,expireAfterSeconds过期的时间。

然后插入数据,等待一段时间查询数据

db.phones.insert({"name":"test","phone":"1231321","time":new Date()})

全文检索

使用$text来进行全文查询

$search来指定查询的条件

查询单个关键字 {"$search":"查询关键字"}

查询多个关键字(或关系){"$search":"查询关键字 查询关键字 查询关键字"}

查询多个关键字(与关键字){"$search":"\"查询关键字\" \"查询关键字\" \"查询关键字\""}

如果要剔除某个关键字 {"$search":"\"查询关键字\" \"查询关键字\" -\"查询关键字\""}加个负号

若是要计算得分的话需要加入{"$score":{"$meta":"textScore"}}

插入一些测试数据

db.news.insert({"title":"china amg lkkl","content":"china"});
db.news.insert({"title":"china","content":"amg"});
db.news.insert({"title":"china amg","content":"lkkl"});
db.news.insert({"title":"lkkl","content":"china"});
db.news.insert({"title":"china amg lkkl 1231","content":"china"});

创建一个全文索引

db.news.ensureIndex({"title":"text","content":"text"})

查询单个关键字示例:

db.news.find({"$text":{"$search":"1231"}})

查询多个字段,或关系

db.news.find({"$text":{"$search":"1231 amg"}})

查询多个字段,与关系

db.news.find({"$text":{"$search":"\"china\" \"amg\""}})

查询多个字段,剔除关系

 db.news.find({"$text":{"$search":"\"china\" \"amg\" -\"lkkl\""}})

给查询查询出来的数据打分,分数越高,越准确。

db.news.find({"$text":{"$search":"\"china\" \"amg\""}},{"score":{"$meta":"textScore"}}).sort({"score":{"$meta":"textScore"}})

设置全文检索

db.news.ensureIndex({"$**","text"}),不建议使用

地理信息索引

分为两类:

2D索引:也就是保存的经纬度的信息。

3D索引:待补充

$near :{"$near":数据,"}默认返回100条数据

db.shops.find({"loc":{"$near":[15,10]}}),返回了所有的数据

$near :{"$near":数据,"$maxDistance":距离} 查询最近的点

 db.shops.find({"loc":{"$near":[15,10],"$maxDistance":10}}),返回最大距离为10的数据

$geoWithin :

{"$box":[[x1,x2],[y1,y2]]} 矩形范围

db.shops.find({"loc":{"$geoWithin":{"$box":[[10,10],[20,20]]}}});

{"$center":[[x1,y1],r]} 圆形范围

 db.shops.find({"loc":{"$geoWithin":{"$center":[[10,10],5]}}});

{"$polygon":[[x1,y1],[x2,y2],...]} 多边范围

db.shops.find({"loc":{"$geoWithin":{"$polygon":[[10,10],[9,11],[100,100]]}}});

版权声明: 原创文章,如需转载,请注明出处。 https://blog.csdn.net/lwx356481/article/details/82348501

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值