1 创建索引

创建单键索引

db.user.createIndex({name:1})

列出集合中的索引

db.user.getIndexes()

创建复合键索引

db.user.createIndex({name:1,balance:-1})

db.wangzhe.createIndex({name:1,nanduValue:-1})

创建多键索引(创建在数组字段上)

type是一个数组字段。

db.wangzhe.createIndex({type:1})

创建一个具有唯一性的索引

db.wangzhe.createIndex({name:1},{unique:true})
db.wangzhe.insert({name:"diaochan",lastAccess:new Date()})
db.wangzhe.insert({name:"diaochan",age:20})
db.wangzhe.insert({realname:"diaochan",age:30})
db.wangzhe.insert({realname:"diaochan",age:20})

稀疏性

如果某个索引具有稀疏性,就表示代表这个索引的数据结构中只会包含这个文档中具有索引键字段的文档。只包含有索引字段的文档的条目,跳过索引键不存在的文档。

如果同一个索引具有唯一性和稀疏性,可以保存多篇缺失索引键值的文档

删除索引,重新测试

db.wangzhe.dropIndex("name_1")

db.wangzhe.createIndex({name:1},{unique:true,sparse:true})

2 索引效果

查看执行计划

db.user.explain().find({balance:100})

db.user.explain().find({name:"zwt"})

stage:IXSCAN,先通过对索引进行扫描,在索引中找到要查询的键值后,找到对应文档的存储地址又执行一次FETCH,FETCH是根据索引当中指示的文档储存地址把对应的文档提取出来。

使用已经创建索引的字段进行排序

db.user.explain().find().sort({name:1,balance:-1})

db.wangzhe.explain().find().sort({name:1,nanduValue:-1})

使用未创建索引的字段进行排序

db.user.explain().find().sort({balance:1})

db.user.explain().find().sort({name:1,balance:1})

3 删除索引

使用索引名称删除索引

db.user.dropIndex("name_1")

使用索引定义删除索引

db.user.dropIndex({"name":1,"balance":-1})

4 地理位置索引

1) 概念

地理信息索引分为两类:2D平面索引,2DSphere球面索引。

在2D索引里面基本上能够保存的信息都是坐标,而且坐标保存的就是经纬度坐标。

具体的应用场景在:微信的摇一摇,大众点评等查询附近的住宿地。滴滴、膜拜、美团单车等基于位置进行查询的场景都可以使用MongoDB的位置索引。

2) 创建数据

db.shop.insert({loc : [10, 10]});
db.shop.insert({loc : [11, 10]});
db.shop.insert({loc : [10, 11]});
db.shop.insert({loc : [12, 15]});
db.shop.insert({loc : [16, 17]});
db.shop.insert({loc : [90, 90]});
db.shop.insert({loc : [150, 160]});

3) 为 shop 集合创建 2D 索引

db.shop.createIndex({"loc" : "2d"})

4) 查询

这个时候 shop 集合就可以实现坐标位置的查询了,而要进行查询有两种查询方式:

"$near" 查询:查询距离某个点最近的坐标点

"$geoWithin" 查询:查询某个形状内的点

5) 查询坐标为 [11, 11]附近的点

db.shop.find({loc : {"$near" : [11, 11]}})

执行上面的代码会发现数据全部返回了,我们可以设置范围查询,使用 "$maxDistance"

// "$maxDistance" 最大距离是5(此处为欧式距离)

db.shop.find({loc : {"$near" : [11, 11], "$maxDistance" : 5}})

注意一点,在2D索引里面支持最大距离,但是不支持最小距离。但可以使用"$geoWithin"设置一个查询范围,设置范围如下

// 第一个坐标表示矩形的左边界,第二个坐标表示矩形的右边界

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

// 第一个表示圆心位置,第二个代表半径

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

// 每个数组代表一个坐标点,这些点代表一个多边形

多边形($polygon):{"$polygon" : [[x1, y1], [x2, y2], [x3, y3],...]}

查询矩形

db.shop.find({loc : {"$geoWithin" : {"$box" : [[9, 9], [11, 11]]}}})

查询圆形

db.shop.find({loc : {"$geoWithin" : {"$center" : [[10, 10], 2]}}})