createIndex() - 创建单个索引
创建单个索引,支持所有 MongoDB 索引选项。
📑 目录
概述
createIndex() 方法用于在集合上创建单个索引。索引可以显著提升查询性能,支持多种类型和选项。
使用场景:
- 优化查询性能
- 实现唯一性约束
- 自动删除过期文档(TTL)
- 支持全文搜索
- 实现部分索引和稀疏索引
语法
参数
keys(必需)
索引键定义对象,指定要索引的字段及其排序方向。
类型: Object
格式:
允许的值:
1- 升序索引-1- 降序索引"text"- 文本索引"2d"- 2D 地理空间索引"2dsphere"- 2D 球面地理空间索引"hashed"- 哈希索引"columnstore"- 列存储索引(MongoDB 6.0+)
options(可选)
索引配置选项对象。
类型: Object
选项列表:
返回值
类型: Promise<Object>
格式:
索引选项详解
unique - 唯一索引
确保索引字段的值在集合中唯一。
特点:
- 防止重复值插入
- 自动拒绝重复数据(抛出错误码 11000)
- 适用于邮箱、用户名、订单号等唯一标识
注意:
- 如果字段已有重复值,创建唯一索引会失败
- null 值也被视为唯一(只能有一个 null)
sparse - 稀疏索引
仅索引包含该字段的文档,忽略缺失字段的文档。
特点:
- 节省存储空间
- 适用于可选字段
- 查询时只包含有该字段的文档
对比:
- 普通索引:索引所有文档(缺失字段视为 null)
- 稀疏索引:仅索引包含字段的文档
expireAfterSeconds - TTL 索引
自动删除过期文档,适用于会话、日志、临时数据。
特点:
- MongoDB 后台线程自动清理
- 清理周期约 60 秒
- 仅适用于 Date 类型字段
注意:
- 文档可能在过期后最多延迟 60 秒才被删除
- 不能用于 _id 字段
- 不能与其他索引类型(如唯一索引)冲突
partialFilterExpression - 部分索引
仅索引满足条件的文档,减少索引大小。
特点:
- 节省存储空间
- 提高索引维护效率
- 仅对满足条件的查询有效
支持的操作符:
$eq,$gt,$gte,$lt,$lte$exists,$type$and,$or
collation - 排序规则
指定字符串比较和排序规则,支持多语言。
常用 locale:
"en"- 英语"zh"- 中文"es"- 西班牙语"fr"- 法语
strength 等级:
1- 仅比较基础字符2- 比较基础字符和重音(默认)3- 比较大小写
hidden - 隐藏索引
索引存在但不被查询使用,用于测试索引删除的影响。
用途:
- 测试删除索引的影响
- 暂时禁用索引而不删除
- A/B 测试索引效果
注意:
- MongoDB 4.4+ 支持
- 索引仍会维护(写入时更新)
- 可以通过
unhideIndex()取消隐藏
wildcardProjection - 通配符投影
配合通配符索引使用,指定包含或排除的字段。
特点:
- 适用于动态字段
- 灵活索引嵌套文档
- 控制索引字段范围
weights - 文本索引权重
指定文本索引中各字段的权重,影响搜索相关性评分。
默认权重: 1
影响:
- 权重越高,匹配时得分越高
- 影响搜索结果排序
代码示例
示例 1: 创建基本索引
示例 2: 创建唯一索引
示例 3: 创建复合索引
复合索引的前缀原则:
示例 4: 创建 TTL 索引
示例 5: 创建部分索引
示例 6: 创建稀疏索引
示例 7: 创建文本索引
示例 8: 创建隐藏索引
示例 9: 创建通配符索引
示例 10: 错误处理
错误处理
常见错误
1. 索引已存在
错误码: MONGODB_ERROR
消息: "索引已存在或名称冲突"
原因: 尝试创建已存在的索引
解决方案:
2. 索引键无效
错误码: INVALID_ARGUMENT
消息: "索引键的值无效"
原因: 使用了不支持的索引值(如 2, 0 等)
解决方案:
3. 唯一索引冲突
错误码: MongoDB 11000
消息: "E11000 duplicate key error"
原因: 创建唯一索引时,集合中已有重复值
解决方案:
4. 不支持的索引类型
错误码: MONGODB_ERROR
消息: "不支持的索引类型"
原因: MongoDB 版本不支持该索引类型
解决方案:
- 检查 MongoDB 版本
- 升级 MongoDB 到支持的版本
- 使用替代索引类型
性能建议
何时创建索引
应该创建索引:
- ✅ 频繁查询的字段
- ✅ 排序字段(ORDER BY)
- ✅ 分组字段(GROUP BY)
- ✅ 连接字段(JOIN)
- ✅ 唯一性约束字段
不应该创建索引:
- ❌ 很少查询的字段
- ❌ 频繁更新的字段
- ❌ 低基数字段(如性别、布尔值)
- ❌ 小表(<1000 条记录)
索引开销
存储开销:
- 每个索引占用额外存储空间
- 复合索引比单字段索引占用更多空间
- 文本索引占用最多空间
写入开销:
- 每次写入需要更新所有相关索引
- 索引越多,写入越慢
- 平衡查询性能和写入性能
维护建议:
ESR 原则
设计复合索引时遵循 ESR 原则:
- Equality(等值):等值查询字段放在最前
- Sort(排序):排序字段放在中间
- Range(范围):范围查询字段放在最后
最佳实践
1. 索引命名规范
2. 索引顺序很重要
3. 避免过度索引
4. 索引覆盖查询
5. 生产环境注意事项
相关方法
createIndexes()- 批量创建多个索引listIndexes()- 列出集合的所有索引dropIndex()- 删除指定索引dropIndexes()- 删除所有索引- 索引管理完整指南 - 索引管理综合文档