mongodb 相关操作

95 阅读2分钟

索引相关

以下是MongoDB创建索引的完整命令及使用场景说明(基于MongoDB 6.0+版本):

关键注意事项

  1. 索引命名规则
    未指定名称时自动生成格式:字段名_排序方向(如 username_1_age_-1

  2. 性能影响

    • 前台构建索引(默认)会阻塞集合操作
    • 大集合建索引建议用 background: true
  3. 内存限制
    单个集合最多64个索引,索引键总长度不超过1024字节

    • 未指定名称时,MongoDB 自动生成索引名(格式:字段名_排序方向,如 email_1)3

基础索引创建

// 单字段升序索引 
db.collection.createIndex({ field: 1 }); 
// 单字段降序索引 
db.collection.createIndex({ field: -1 }); 
// 复合索引(多字段组合) 
db.collection.createIndex({ field1: 1, field2: -1 });
// 索引名称必须在集合内唯一,且不可超过 128 字符
// 名称一旦设定不可修改,如需变更需删除后重建索引
// 为索引指定名称
db.collection.createIndex({ field: 1 }, { name: "custom_index_name" });
// 创建单字段索引并命名
db.users.createIndex({ email: 1 }, { name: "unique_email_index" });
// 创建复合索引并命名
db.orders.createIndex({ userId: 1, orderDate: -1 }, { name: "user_order_history" });

 特殊类型索引

// 文本索引(全文搜索) 
db.collection.createIndex({ content: "text" }); 
// 地理空间索引(2dsphere) 
db.collection.createIndex({ location: "2dsphere" }); 
// TTL索引(自动过期数据) 
db.collection.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 }); 
// 唯一索引 
db.collection.createIndex({ email: 1 }, { unique: true }); 
// 稀疏索引(仅索引包含该字段的文档) 
db.collection.createIndex({ optionalField: 1 }, { sparse: true });
//查看索引
db.collection.getIndexes();

⚙️ 高级选项参数

// 后台构建索引(不阻塞数据库操作)
db.collection.createIndex({ field: 1 }, { background: true }); 

// 自定义索引名称
db.collection.createIndex({ field: 1 }, { name: "custom_index_name" });  

// 部分索引(仅索引满足条件的文档)
db.collection.createIndex(
  { field: 1 },
  { partialFilterExpression: { status: { $eq: "active" } } }
);

关键注意事项

  1. _id 索引不可删除
    默认的 _id 字段索引无法删除,需删除整个集合才能移除。
  2. 索引名称的特殊性
    若索引名含空格或特殊字符(如 "Release Date_1"),需用英文引号包裹名称。
  3. 嵌套对象索引删除
    方法相同:先通过 getIndexes() 确认嵌套字段索引名,再用 dropIndex() 删除5。
  4. 删除后验证
    再次运行 db.<集合名>.getIndexes() 确认索引已移除。

💡 操作建议

  • 生产环境谨慎操作‌:删除高频使用索引可能导致性能下降,建议先通过 $hideIndex() 隐藏索引评估影响。
  • TTL索引特殊性‌:TTL索引通过过期机制自动删除文档,但磁盘空间可能不会立即释放。
// 删除索引需严格匹配名称;
db.<集合名>.dropIndex("索引名称");   
// 删除名为 "Release Date_1" 的索引
db.task.dropIndex("Release Date_1");  
// 删除多个索引传入索引名称数组:
db.<集合名>.dropIndexes(["索引1", "索引2", "索引3"]); 
// 清除非 `_id` 的所有索引:
db.<集合名>.dropIndexes();  
// 1. 查看索引
db.movies.getIndexes();
// 2. 删除指定索引
db.movies.dropIndex("Release Date_1");
// 3. 验证结果
db.movies.getIndexes();