MongoDb的如何创建索引 ?
参考回答
在 MongoDB 中,索引可以通过以下方式创建:
- 使用 默认索引:MongoDB 在每个集合的
_id字段上自动创建唯一索引。 - 使用 显式索引:可以通过
createIndex()方法在指定字段上创建索引。
基本语法:
db.collection.createIndex({ <field1>: <type1>, <field2>: <type2>, ... }, { <options> })
<field>:指定字段名。<type>:1 表示升序,-1 表示降序。<options>:可选参数,用于配置索引属性(如唯一性、TTL 等)。
例子:
对 name 字段创建升序索引:
db.users.createIndex({ name: 1 })
详细讲解与拓展
1. 默认索引
- 每个集合在
_id字段上默认创建一个唯一索引。 - 作用:快速定位文档,确保
_id的唯一性。 - 特点:不可删除,除非删除整个集合。
2. 创建单字段索引
单字段索引是最常用的索引类型。
语法:
db.collection.createIndex({ field: 1 }) // 升序索引
db.collection.createIndex({ field: -1 }) // 降序索引
例子:对 age 字段创建降序索引:
db.users.createIndex({ age: -1 })
3. 创建复合索引
复合索引用于多个字段的查询优化。
语法:
db.collection.createIndex({ field1: 1, field2: -1 })
例子:对 name 和 age 创建复合索引:
db.users.createIndex({ name: 1, age: -1 })
注意:
– 查询时必须包含复合索引的前缀字段。例如,{ name: "Alice" } 和 { name: "Alice", age: 30 } 可以使用此索引,而 { age: 30 } 无法使用。
4. 创建多键索引
多键索引用于数组字段,每个数组元素都会创建一个索引。
例子:
对 tags 数组字段创建索引:
db.products.createIndex({ tags: 1 })
文档示例:
{
"name": "Book",
"tags": ["education", "reading", "literature"]
}
查询时,db.products.find({ tags: "education" }) 会利用索引。
5. 创建唯一索引
唯一索引限制字段值不能重复。
语法:
db.collection.createIndex({ field: 1 }, { unique: true })
例子:对 email 字段创建唯一索引:
db.users.createIndex({ email: 1 }, { unique: true })
注意:
– 如果已有重复值,创建唯一索引会失败。
– 可配合 sparse 选项,忽略 null 或不存在的字段。
6. TTL 索引
TTL(Time-To-Live)索引会自动删除过期文档,适用于日志或临时数据存储。
语法:
db.collection.createIndex({ createdAt: 1 }, { expireAfterSeconds: <seconds> })
例子:为 createdAt 字段创建 10 分钟过期的索引:
db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 600 })
注意:
– createdAt 字段必须是日期类型。
7. 全文索引
全文索引用于文本搜索,支持多语言的复杂匹配。
语法:
db.collection.createIndex({ field: "text" })
例子:对 description 字段创建全文索引:
db.articles.createIndex({ description: "text" })
查询时,可以使用 $text 操作符:
db.articles.find({ text: {search: "mongodb tutorial" } })
8. 查看和删除索引
- 查看索引:
db.collection.getIndexes() - 删除索引:
删除指定索引:db.collection.dropIndex("<index_name>")删除所有索引(保留 `_id` 索引):
db.collection.dropIndexes()
示例:综合应用
假设有一个用户集合 users:
[
{ "name": "Alice", "email": "alice@example.com", "age": 30, "tags": ["admin", "manager"] },
{ "name": "Bob", "email": "bob@example.com", "age": 25, "tags": ["developer"] }
]
创建以下索引:
1. 单字段索引:加速按 name 查询。
“`javascript
db.users.createIndex({ name: 1 })
“`
- 复合索引:加速按
name和age的查询。db.users.createIndex({ name: 1, age: -1 }) - 多键索引:加速数组字段
tags的查询。db.users.createIndex({ tags: 1 }) - 唯一索引:确保
email字段的唯一性。db.users.createIndex({ email: 1 }, { unique: true })
总结
MongoDB 提供了多种索引类型,包括单字段索引、复合索引、多键索引、TTL 索引和全文索引。通过 createIndex() 方法可以灵活创建索引来优化查询性能。同时,索引的使用需要根据实际查询需求合理设计,以避免不必要的存储和性能开销。