这段代码是 MongoDB 的 Shell 脚本 (或兼容语法),用于在 activities 集合上创建一个复合索引(Compound Index)。下面我来逐行解释其含义和作用。
📜 原始代码
javascript
db.getCollection("activities").createIndex({
isPublic: Int32("1"),
isFeatured: Int32("1"),
createdAt: Int32("-1")
}, {
name: "isPublic_1_isFeatured_1_createdAt_-1",
background: true
});
✅ 一、createIndex() 的作用
在 MongoDB 中,createIndex() 用于为集合创建索引,以加速查询性能。
✅ 二、第一个参数:索引的字段和排序方向
javascript
{
isPublic: Int32("1"),
isFeatured: Int32("1"),
createdAt: Int32("-1")
}
这定义了一个 复合索引 ,包含三个字段,每个字段的值表示排序方向:
| 字段 | 排序方向 | 含义 |
|---|---|---|
isPublic |
1 |
升序排序(从小到大) |
isFeatured |
1 |
升序排序 |
createdAt |
-1 |
降序排序(从新到旧) |
🔍 注意 :
Int32("1")和Int32("-1")写法虽然不常见,但 MongoDB 会将其解析为整数1和-1。更常见的写法是直接写1或-1,例如:
javascript{ isPublic: 1, isFeatured: 1, createdAt: -1 }所以这等价于标准写法。
🎯 这个索引适合哪些查询?
该索引最适合用于以下类型的查询:
javascript
db.activities.find({
isPublic: true,
isFeatured: true
}).sort({ createdAt: -1 })
或者:
javascript
db.activities.find({
isPublic: true,
isFeatured: true,
createdAt: { $lt: ISODate("...") }
}).sort({ createdAt: -1 })
✅ 优势:
- 可快速过滤
isPublic和isFeatured字段(等值查询) - 同时支持按
createdAt降序排序(如"最新活动"列表) - 避免在查询时进行
SORT阶段的内存排序或阻塞
✅ 三、第二个参数:索引选项
javascript
{
name: "isPublic_1_isFeatured_1_createdAt_-1",
background: true
}
1. name: "isPublic_1_isFeatured_1_createdAt_-1"
- 指定索引的名称。
- 如果不指定,MongoDB 会自动生成一个(如
isPublic_1_isFeatured_1_createdAt_-1)。 - 显式命名便于后续管理(查看、删除、调试)。
2. background: true
- 表示这个索引将在后台创建。
- 作用 :
- 创建索引时不会阻塞数据库的其他读写操作。
- 对生产环境非常重要,避免服务中断。
- 代价 :
- 创建时间可能稍长。
- 期间仍可写入数据,索引会自动合并。
⚠️ 默认是
background: false(前台创建),会锁定集合,不建议在生产环境使用。
✅ 四、完整解释总结
这条语句的作用是:
在
activities集合上创建一个名为"isPublic_1_isFeatured_1_createdAt_-1"的复合索引,索引字段为:
isPublic(升序)isFeatured(升序)createdAt(降序,即最新在前)索引在后台异步创建,不阻塞数据库的正常读写操作。
✅ 五、适用场景举例
假设你有一个"活动列表"页面,要求:
- 只展示公开(
isPublic: true)且被推荐(isFeatured: true)的活动 - 按创建时间从新到旧排序
- 支持分页
有了这个索引,这类查询将非常高效。
✅ 六、建议优化
-
简化写法(推荐):
javascriptdb.activities.createIndex( { isPublic: 1, isFeatured: 1, createdAt: -1 }, { name: "isPublic_1_isFeatured_1_createdAt_-1", background: true } ) -
考虑稀疏索引?
如果
isFeatured大部分是false,可以考虑加sparse: true来节省空间(但 MongoDB 5.0+ 已弃用sparse,推荐用partialIndexFilter)。 -
部分索引(Partial Index)更高效(可选):
javascriptdb.activities.createIndex( { isPublic: 1, isFeatured: 1, createdAt: -1 }, { name: "idx_public_featured_latest", background: true, partialFilterExpression: { isPublic: true, isFeatured: true } } )- 只为
isPublic: true且isFeatured: true的文档建立索引,更小更快。
- 只为
✅ 总结
| 项目 | 说明 |
|---|---|
| 集合 | activities |
| 索引类型 | 复合索引 |
| 字段顺序 | isPublic ↑, isFeatured ↑, createdAt ↓ |
| 用途 | 加速"公开+推荐+按时间倒序"的查询 |
| 命名 | 自定义名称,便于管理 |
| 创建方式 | 后台创建,不影响线上服务 |
📌 结论:这是一个合理、高效、适用于生产环境的索引创建语句。