显式建集合的意义
不建集合也能写入:第一次插入时数据库会自动创建,但只能使用默认选项。显式调用 createCollection 才能带上固定集合、校验器、排序规则、时序集合等参数,而这些选项一旦定下,事后修改往往受限(校验器可通过 collMod 调整)。因此对结构有要求的集合,建议在建库脚本里显式创建而不是让写入顺带创建。
基本信息
| 语法 | db.createCollection(name, options) |
|---|---|
| 常用选项 | capped + size + max、validator、validationLevel、collation、timeseries、expireAfterSeconds |
| 查看 | db.getCollectionNames() 与 db.getCollectionInfos() |
| 自动创建 | 写入不存在的集合时按默认选项创建,无法携带自定义参数 |
| 适用版本 | 各选项的可用版本不同,时序集合需 5.0 及以上 |
| 权限要求 | 需要对应库的 createCollection 权限 |
典型使用场景
- 环形日志缓冲:固定集合保留最近一段数据,写满自动淘汰旧文档
- 结构约束:用校验器限制必填字段与取值范围,挡住脏数据
- 多语言排序:指定 collation 让字符串比较符合业务语言习惯
- 时序数据落地:用时序集合存储指标,配合过期时间自动清理
- 环境初始化脚本:把集合与索引显式声明,避免各环境结构不一致
创建示例
创建示例
// 固定集合:写入顺序固定,超过 size 后自动淘汰最旧文档
db.createCollection("logs", { capped: true, size: 104857600, max: 100000 })
// 带校验器的集合:约束字段类型与取值范围
db.createCollection("orders", {
validator: { $jsonSchema: {
bsonType: "object", required: ["sku", "qty"],
properties: { sku: { bsonType: "string" }, qty: { bsonType: "int", minimum: 1 } }
} },
validationLevel: "strict", validationAction: "error"
})
// 时序集合:按时间字段与元数据字段组织,过期自动清理
db.createCollection("metrics", {
timeseries: { timeField: "ts", metaField: "meta", granularity: "hours" },
expireAfterSeconds: 86400 * 30
})
db.getCollectionNames()选项读法
| 选项 | 作用 | 注意点 |
|---|---|---|
| capped + size | 固定集合与容量上限(字节) | 写满后自动淘汰旧文档,不能删除单条 |
| max | 固定集合的最大文档数 | 与 size 先到者生效 |
| validator | 写入校验规则(如 $jsonSchema) | 只对启用后的写入生效 |
| validationLevel / action | 校验严格程度与处理方式 | moderate 放宽历史文档,warn 只记录不拒绝 |
| collation | 字符串比较与排序规则 | 影响索引使用与查询匹配 |
| timeseries | 时序集合的时间与元数据字段 | 需 5.0 及以上,写读方式与普通集合有差异 |
固定集合适合环形缓冲:写入顺序稳定、到量自动淘汰,但不能删除单条文档,也不能让更新改变文档大小。新项目做大体积日志缓冲时,也可以评估时序集合。
校验器只约束之后的写入:历史不合规数据不会被自动清理,启用前要评估存量数据对更新操作的影响。