
MongoDB 的数据库和集合并非通过 DB() 或 C() 方法显式创建,而是惰性生成:仅当首次执行写操作(如插入文档)时,服务端才真正创建对应数据库和集合。
mongodb 的数据库和集合并非通过 `db()` 或 `c()` 方法显式创建,而是惰性生成:仅当首次执行写操作(如插入文档)时,服务端才真正创建对应数据库和集合。
在 Go 中使用 mgo(或现代替代库如 mongo-go-driver)访问 MongoDB 时,调用 session.DB("taskdb").C("categories") 仅返回一个逻辑上的数据库与集合引用对象——它不触发任何服务端创建行为,无论 "taskdb" 或 "categories" 是否已存在。
✅ 正确理解如下:
- session.DB("taskdb") 返回一个指向名为 taskdb 的数据库的句柄;若该库尚不存在,它不会立即创建,仅作标识。
- .C("categories") 同理,仅获取名为 categories 的集合句柄,不发送任何创建请求到 MongoDB 服务器。
? 真正的创建发生在首次写入时:
c := session.DB("taskdb").C("categories")
err := c.Insert(bson.M{"name": "Programming", "priority": 1})
if err != nil {
log.Fatal(err)
}
此时,MongoDB 才会自动创建 taskdb 数据库(若不存在)及 categories 集合(若不存在),并插入第一条文档。
⚠️ 注意事项:
- 读操作(如 Find().All())即使面对不存在的库/集合,也不会报错(返回空结果),但也不会触发创建;
- 没有类似 SQL 的 CREATE DATABASE 或 CREATE COLLECTION 命令——MongoDB 的设计哲学是“按需创建”;
- 使用 mongo-go-driver 时行为一致:client.Database("db").Collection("coll") 同样仅为声明式引用,创建仍依赖首次写入(或显式调用 CreateCollection 等管理命令,但非常规业务场景所需);
- 生产环境中建议预建索引、启用校验器等,但这些需在写入前通过 db.createCollection() 或驱动提供的管理 API 显式执行,不属于 C() 方法职责。
总结:DB() 和 C() 是轻量级句柄构造方法,专注连接抽象而非资源初始化;真正的数据库与集合诞生于第一行数据落盘之时——这是 MongoDB “Schema-less” 与“Lazy Creation” 特性的核心体现。











