Mongo采用的是BSON索引,允许对文档中任一字段创建索引
Mongo索引的基本命令
创建索引 createIndex({字段1:字段排序方式,...,字段n:字段排序方式}); //字段排序方式分为1和-1,1代表升序,-1代表降序
删除索引 dropIndex({字段1:字段排序方式,...,字段n:字段排序方式})
查询索引 getIndexes()
Mongo索引包含以下几种
1. 单键索引
createIndex(字段,字段排序方式),只能用于一个属性上
2 复合索引
createIndex(字段1:字段排序方式,字段2:字段排序方式2)
注意,查询时要按照复合索引创建顺序来查询,如上,以下几种方式是没法走索引的:
createIndex(字段2:字段排序方式,字段1:字段排序方式1)
db.table.find(字段2:字段排序方式)
3 全文搜索索引/文本搜索索引
即针对Mongo文本字段上创建索引。比如有一个名为Test的collection,collection中有一个为description的字段。则可在description上创建全文搜索索引 db.Test.createIndex({description:"text"}),全文搜索引擎创建完成后,可以基于$text和$search进行全文搜索引擎进行查询,比如要查询description中包含enhance字段的内容,其查询语法为:db.Test.find({$text:{$search:"enhance"}});
假设Test中有如下内容
{ "_id": 1, "description": "Learn MongoDB enhance" }
{ "_id": 2, "description": "Advanced MongoDB queries" }
{ "_id": 3, "description": "Mongo enhance" }
那么db.Test.find({$text:{$search:"enhance"}})查询结果为
{ "_id": 3, "description": "Mongo enhance" }
{ "_id": 1, "description": "Learn MongoDB enhance" }
4 TTL索引
并非所有数据都需要持久化,过了一段时间后数据被自动硬删除,TTL对此场景进行支持,其格式为:db.collectionName.createIndex({ 'createDate': 1}, { expireAfterSeconds: 3600 }); expireAfterSeconds=3600表示数据将在createdDate之后3600秒(1小时)后过期被自动删除
- 字段类型:用于TTL的字段通常是日期类型(如
Date),也可以是数字类型的时间戳(如NumberLong),但最好是使用Date类型,因为MongoDB可以更准确地处理日期 - TTL不能用于复合索引
- 索引方向:TTL索引只能升序排序(即
{ field: 1 }),因为MongoDB需要能够找到最早应该被删除的文档
- 性能:虽然TTL索引可以提高数据的清理效率,但过多的使用或不当的使用(如频繁更新过期时间)可能会影响数据库性能。确保合理设计数据模型和索引策略。
- 后台任务:MongoDB有一个后台任务定期检查并删除过期的文档。这个任务的频率和性能可以根据系统的负载自动调整。
5 唯一索引
unique=true选项可将索引定义为唯一性索引:db.user.ensureIndex({ name: 1 }, { unique: true }); //name字段不允许出现重复值
也可用于复合索引:db.book.ensureIndex({ type: 1, title: 1}, { unique: true }); // type+tile在表中不能出现重复
也可用于嵌套文档::db.user.ensureIndex({ 'health.height': 1}, { unique: true });
浙公网安备 33010602011771号