MongoDB VS MySQL - 为啥 mongo/mongoose 会自动创建数据库和集合?
Posted
技术标签:
【中文标题】MongoDB VS MySQL - 为啥 mongo/mongoose 会自动创建数据库和集合?【英文标题】:MongoDB VS MySQL - why mongo/ mongoose creates db and collections automatically?MongoDB VS MySQL - 为什么 mongo/mongoose 会自动创建数据库和集合? 【发布时间】:2016-10-22 14:54:00 【问题描述】:来自 mysql 的背景,我觉得 MongoDB 有点奇怪。
例如,我还没有创建数据库,但是:
mongoose.connect('mongodb://localhost/kittendb');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function()
// we're connected!
// Start the application after the database connection is ready
app.listen(3000);
console.log("Listening on port 3000");
);
结果:
the kittendb is created // you'll get error in mysql
另一个:
我还没有在数据库中创建集合,但是:
var kittySchema = mongoose.Schema(
name: String
);
var Kitten = mongoose.model('Kitten', kittySchema);
var fluffy = new Kitten( name: 'fluffy' );
fluffy.save(function (err, fluffy)
if (err) return console.error(err);
);
结果:
fluffy is inserted into kittens collection! // you'll get an error in mysql
mongo 控制台:
> show dbs
kittendb 0.203125GB
local 0.078125GB
> use kittendb
switched to db kittendb
> db.kittens.find()
"__v" : 0, "_id" : ObjectId("5768e747cf72dd364e7b2fdf"), "name" : "fluffy"
那么 mongo 或 mongoose 是怎么回事?它到底是怎么知道将小猫保存到我没有创建的小猫收藏中的!??
我错过了什么?
【问题讨论】:
Mongodb 不是 mysql。将 sql 经验应用到 nosql db 是不公平的,在很多情况下会导致意想不到的结果。 The docs 明确指出集合是在第一次插入时创建的。 【参考方案1】:它到底是怎么知道将小猫保存到我没有创建的小猫收藏中的!??
Mongoose 使用的命名方案基于您的模型名称:
var Kitten = mongoose.model('Kitten', kittySchema);
模型被命名为“小猫”。默认情况下,Mongoose 会将该名称小写和复数(因此 "Kitten" 变为 "kittens")并将其用作集合名称。
至于 MongoDB 为什么/如何自动创建数据库/集合:这是 MongoDB 创建者做出的设计决定。因为 MongoDB 中的数据库和集合是无模式的,所以不需要显式的 CREATE
操作(尽管要创建某些特殊类型的集合,MongoDB 确实有一个 db.createCollection()
命令)。
【讨论】:
感谢您的回答和精彩的解释! 对了,什么是无模式和模式——它们之间有什么区别? @teelou schemaless 基本上意味着它不需要像 SQL 那样创建表,并且插入到集合中的文档不必相似。以上是关于MongoDB VS MySQL - 为啥 mongo/mongoose 会自动创建数据库和集合?的主要内容,如果未能解决你的问题,请参考以下文章