mongoDB学习(三)--索引操作

索引的种类

  • _id索引
  • 单键索引
  • 多键索引
  • 复合索引
  • 过期索引
  • 全文索引
  • 地理位置索引

查看集合索引

db.mongo_collection.getIndexes():可用来查看当前集合所有索引

创建索引

db.mongo_collection.ensureIndex(json):创建一个索引,db.mongo_collection.ensureIndex({x:1}),其中x代表方向,正1代表正向排序,负1代表逆向排序,在数据文档较多,使用此命令会严重影响性能,所以要在一开始就要创建好索引。

_id索引

_id索引是绝大多数集合默认建立的索引,对于每个插入的数据,mongodb都会自动生成一条唯一的_id字段

全文索引

对字符串与字符串数组创建全文可搜索的索引。使用情况:{author:”“,title:”“,article:”“}。

创建全文索引

db.mongo_collection.ensureIndex({key:”text”})
db.mongo_collection.ensureIndex({key1:”text”,key2:”text”})
db.mongo_collection.ensureIndex({“$**”:”text”})对所有字段建立全文索引,创建全文索引的方式类似于单建索引和复合索引,只是value变成了text。

使用全文索引进行查询

首先构造数据集:db.mongo_collection.insert({article:”aa bb cc dd”})

db.mongo_collection.insert({article:”aa cc dd ee”})
db.mongo_collection.insert({article:”aa bb dd fe”})
db.mongo_collection.insert({article:”aa bb cc dd kajds”})

查询:db.mongo_collection.find({$text:{$search:string}}),string是要查询的关键字

db.mongo_collection.find({$text:{$search:”aa”}}),查找aricle中带有关键字aa的所有记录;
db.mongo_collection.find({$text:{$search:”aa cc”}}),查找article中带有关键字aa或cc的所有记录;
db.mongo_collection.find({$text:{$search:”aa -cc”}}),查找article中带有关键字aa但不带有cc的所有记录,“-”表示排除,“ ”空格表示或;
db.mongo_collection.find({$text:{$search:”\”aa\” \”cc\”“}}),查找article中带有关键字aa和cc的所有记录,其中”需要转译。

全文索引的相似度

$meta操作符:{score:{$meta:”textScore”}}

写在查询条件后面可以返回返回结果的相似度。
与sort一起使用,可以达到很好的实用效果。
例如:db.mongo_collection.find({$text:{$search:”aa cc”}},{score:{$meta:”textScore”}}),返回结果会带有每条记录的相似度得分,得分越高,查询结果匹配度越高。
- 此外,还可以利用score进行排序:db.mongo_collection.find({$text:{$search:”aa cc”}},{score:{$meta:”textScore”}}).sort({score:{$meta:”textScore”}})

全文索引的使用限制

  • 每次查询只能指定一个$text查询
  • text nor查询中
  • 查询中如果包含了$text,hint(强制指定索引)不再起作用
  • mongodb还不支持中文全文索引

索引的属性

比较重要的属性有:

  • 名字,name指定:db.mongo_collection.ensureIndex({},{name:”“})

  • 唯一性,unique指定:db.mongo_collection.ensureIndex({},{unique:T/F}),unique为true表示在同一集合中不允许插入两条具有同一唯一索引的字段,类似于mysql中insert ignore功能
    比如:db.mongo_collection.ensureIndex({m:1,n:1},{unique:true})
    然后,db.mongo_collection.insert({m:1,n:2}),db.mongo_collection.insert({m:1,n:2})第二次插入会抛出key冲突的错误

  • 稀疏性,sparse指定:db.mongo_collection.ensureIndex({},{sparse:T/F}),默认为false,稀疏性的不同,代表了mongodb在处理索引中存在,但是文档中不存在的字段的两种不同的方法,当sparse为true,mongodb不为不存在的字段创建索引,可以减少磁盘消耗,增大插入速度,要注意的是,不能在稀疏索引上查找这个字段不存在的记录。
    比如:db.mongo_collection.insert({m:1})
    db.mongo_collection.insert({n:1})
    db.mongo_collection.find({m:{$exists:true}})能够查找到{m:1}这条记录
    现在在{m:1}上创建稀疏索引:db.mongo_collection.ensureIndex({m:1},{sparse:true}),那么{n:1}不会创建{m:1}索引,现在db.mongo_collection.find({m:{$exists:false}})依然会查找到{n:1}的记录,这便是异常所在。db.mongo_collection.find({m:{$exists:false}}).hint(“m_1”),此处强制指定使用m_1索引
  • 是否定时删除,expireAfterSeconds指定,同过期索引

地理位置索引

  • 概念:将一些点的位置存储在mongodb中,创建索引后,可以按照位置来查找其他点。
  • 子分类:2d索引,用于存储和查找平面上的点。
    2dsphere索引,用于存储和查找球面上的点

查找方式

1、查找距离某个点一定距离内的点
2、查找包含在某区域内的点

2d索引:平面地理位置索引

  • 创建方式:db.mongo_collection.ensureIndex({w:”2d”}),w是字段名。
  • 位置表示方式:经纬度[经度,纬度],取值范围:经度[-180,;180],纬度[-90,90],经度超过范围mongodb会报错,纬度超过范围不会,但在查询时会遇到不可预知的错误。
  • 查找方式:$near查询,查询距离某个点最近的点,
    $geoWithin查询,查询某个形状的点。
    比如:db.mongo_collection.find({w:{$near:[1,1]}}),返回距离[1,1]最近的点,默认是100个,可以使用$maxDistance限制最远距离,db.mongo_collection.find({w:{$near:[1,1],$maxDistance:10}}),返回距离[1,1]最远距离是10的点。

形状的表示

1、$box:矩形,使用{$box:[[,],[,]]}表示,第一个坐标代表左边界,第二个坐标代表右边界。
2、$center:圆形,使用{$center:[[,],r]}表示
3、$polygon:多边形,使用{$polygon:[[,],[,],[,]]}表示。
示例:db.mongo_collection.find({w:{$geoWithin:{$box:[[1,1],[2,3]]}}}),
db.mongo_collection.find({w:{$geoWithin:{$center:[[1,3],3]}}})

geoNear查询

geoNear查询使用runCommand命令进行使用,db.runCommand({geoNear:,near:[,],minDistance:(对2D索引无效,2Dsphere有效),maxDistance:(最大距离),num:(返回结果个数)})

2dSphere索引:球面地理位置索引

  • 创建方式:db.mongo_collection.ensureIndex({w:”2dsphere”})
  • 位置表示方式:GeoJson,描述一个点,一条直线,多边形等形状,格式:{type:”“,coordinates:[]}
  • 查询方式与2D索引查询方式类似,支持 minDistance maxDistance。
    2dsphere查询除了支持 near geoWithin,还支持查询两个多边形的交叉点

如何评判当前索引的构建情况

1、mongostat
2、profile集合
3、日志
4、explain分析

mongostat

  • 查看mongodb运行状态的程序
  • 使用说明:mongostat -h IP:port(可以使用mongostat -help查看帮助)
  • 字段说明:
    索引情况:idx miss 表示当前的查询没有使用索引的情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值