1. 单字段索引
对普通字段创建索引
db.book.ensureIndex({title: 1})
对内嵌的文档字段创建索引
db.book.ensureIndex({author.name: 1})
2. 复合索引
复合索引的字段顺序、字段的升降序对查询性能有影响,
db.book.ensureIndex({type: 1, favCount: 1})
3. 数组索引
也叫多值索引,
db.book.ensureIndex({tags: 1})
数组索引必然会使索引的条目和体积发生膨胀。为了避免时空,有必要在文档设计上做出一些限制。
4. 复合的多值索引
MongoDB不支持一个复合索引中同时出现多个数组字段。
5. 地理空间索引
专门用于实现位置检索的一种特殊索引。
例如:
{
restaurantId: 0,
restaurantName: "兰州牛肉面",
location: {
type: "Point",
coordinates: [37.449157, -122.158574]
}
}
location字段是一个内嵌型文档,用于表明商家的地理位置,其中type表示这是地图上的一个点,coordinates则是经纬度。
接下来创建一个2dsphere索引,如下:
db.restaurant.ensureIndex({location: "2dsphere"})
最后,执行查询,检索附件5千米内的商家,如下:
b.restaurants.find({
location: {
$near: {
$geometry: {type: "Point", coordinates: [37.449, -122.158]}},
$maxDistance: 5000
}
})
6. 唯一性约束
例如
db.book.ensureIndex({title: 1}, {unique: true})
对于制定字段已经存在重复记录的集合,尝试创建唯一性索引会报错。
6.1 复合索引的唯一性
db.book.ensureIndex({type: 1, title: 1}, {unique: true})
6.2 嵌套文档的唯一性
db.book.ensureIndex({author.name: 1}, {unique: true})
6.4 数组的唯一性
7. TTL索引
对于老化数据的处理,MongoDB提供了便捷的做法,TTL索引,通过声明一个日期类型的字段,然后在日期字段上加上TTL索引:
db.systemlog.insert({createdDate: new Date(), type: "alarm", message: "..."})
db.systemlog.ensureIndex({createdDate: 1}, {expireAfterSeconds: 3600})
创建TTL索引后,该数据会在3600秒后过期,MongoDB会周期性运行后台线程中对该集合进行检查及数据清理工作。
网友评论