MongoDb的如何创建索引 ?

参考回答

在 MongoDB 中,索引可以通过以下方式创建:

  1. 使用 默认索引:MongoDB 在每个集合的 _id 字段上自动创建唯一索引。
  2. 使用 显式索引:可以通过 createIndex() 方法在指定字段上创建索引。

基本语法:

db.collection.createIndex({ <field1>: <type1>, <field2>: <type2>, ... }, { <options> })
JavaScript
  • <field>:指定字段名。
  • <type>:1 表示升序,-1 表示降序。
  • <options>:可选参数,用于配置索引属性(如唯一性、TTL 等)。

例子
name 字段创建升序索引:

db.users.createIndex({ name: 1 })
JavaScript

详细讲解与拓展

1. 默认索引

  • 每个集合在 _id 字段上默认创建一个唯一索引。
  • 作用:快速定位文档,确保 _id 的唯一性。
  • 特点:不可删除,除非删除整个集合。

2. 创建单字段索引

单字段索引是最常用的索引类型。
语法

db.collection.createIndex({ field: 1 }) // 升序索引
db.collection.createIndex({ field: -1 }) // 降序索引
JavaScript

例子:对 age 字段创建降序索引:

db.users.createIndex({ age: -1 })
JavaScript

3. 创建复合索引

复合索引用于多个字段的查询优化。
语法

db.collection.createIndex({ field1: 1, field2: -1 })
JavaScript

例子:对 nameage 创建复合索引:

db.users.createIndex({ name: 1, age: -1 })
JavaScript

注意
– 查询时必须包含复合索引的前缀字段。例如,{ name: "Alice" }{ name: "Alice", age: 30 } 可以使用此索引,而 { age: 30 } 无法使用。


4. 创建多键索引

多键索引用于数组字段,每个数组元素都会创建一个索引。
例子
tags 数组字段创建索引:

db.products.createIndex({ tags: 1 })
JavaScript

文档示例:

{
    "name": "Book",
    "tags": ["education", "reading", "literature"]
}
JSON

查询时,db.products.find({ tags: "education" }) 会利用索引。


5. 创建唯一索引

唯一索引限制字段值不能重复。
语法

db.collection.createIndex({ field: 1 }, { unique: true })
JavaScript

例子:对 email 字段创建唯一索引:

db.users.createIndex({ email: 1 }, { unique: true })
JavaScript

注意
– 如果已有重复值,创建唯一索引会失败。
– 可配合 sparse 选项,忽略 null 或不存在的字段。


6. TTL 索引

TTL(Time-To-Live)索引会自动删除过期文档,适用于日志或临时数据存储。
语法

db.collection.createIndex({ createdAt: 1 }, { expireAfterSeconds: <seconds> })
JavaScript

例子:为 createdAt 字段创建 10 分钟过期的索引:

db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 600 })
JavaScript

注意
createdAt 字段必须是日期类型。


7. 全文索引

全文索引用于文本搜索,支持多语言的复杂匹配。
语法

db.collection.createIndex({ field: "text" })
JavaScript

例子:对 description 字段创建全文索引:

db.articles.createIndex({ description: "text" })
JavaScript

查询时,可以使用 $text 操作符:

db.articles.find({ text: {search: "mongodb tutorial" } })
JavaScript

8. 查看和删除索引

  • 查看索引
    db.collection.getIndexes()
    
    JavaScript
  • 删除索引
    删除指定索引:

    db.collection.dropIndex("<index_name>")
    
    JavaScript

    删除所有索引(保留 `_id` 索引):

    db.collection.dropIndexes()
    
    JavaScript

示例:综合应用

假设有一个用户集合 users

[
    { "name": "Alice", "email": "alice@example.com", "age": 30, "tags": ["admin", "manager"] },
    { "name": "Bob", "email": "bob@example.com", "age": 25, "tags": ["developer"] }
]
JSON

创建以下索引:
1. 单字段索引:加速按 name 查询。

“`javascript
db.users.createIndex({ name: 1 })
“`

  1. 复合索引:加速按 nameage 的查询。
    db.users.createIndex({ name: 1, age: -1 })
    
    JavaScript
  2. 多键索引:加速数组字段 tags 的查询。
    db.users.createIndex({ tags: 1 })
    
    JavaScript
  3. 唯一索引:确保 email 字段的唯一性。
    db.users.createIndex({ email: 1 }, { unique: true })
    
    JavaScript

总结

MongoDB 提供了多种索引类型,包括单字段索引、复合索引、多键索引、TTL 索引和全文索引。通过 createIndex() 方法可以灵活创建索引来优化查询性能。同时,索引的使用需要根据实际查询需求合理设计,以避免不必要的存储和性能开销。

发表评论

后才能评论