• 索引的种类
  • 查看集合索引
  • 创建索引
  • _id索引
  • 全文索引
  • 创建全文索引
  • 使用全文索引进行查询
  • 首先构造数据集dbmongo_collectioninsertarticleaa bb cc dd
  • 查询dbmongo_collectionfindtextsearchstringstring是要查询的关键字
  • 全文索引的相似度
  • meta操作符scoremetatextScore
  • 全文索引的使用限制
  • 索引的属性
  • 地理位置索引
  • 查找方式
  • 2d索引平面地理位置索引
  • 形状的表示
  • geoNear查询
  • 2dSphere索引球面地理位置索引
  • 如何评判当前索引的构建情况
  • mongostat


索引的种类

  • _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 表示当前的查询没有使用索引的情况