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