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 会自动创建数据库和集合?的主要内容,如果未能解决你的问题,请参考以下文章

为啥以及何时需要在 MongoDB 中重建索引?

磊哥评测之数据库:腾讯云MongoDB vs自建

Python-Mongodb vs mysql

mongodb为啥比mysql快

MongoDB vs MySQL,哪个效率更高?

MongoDB vs MySQL,哪个效率更高?