2016-06-21 90 views
0

從MySQL的背景來看,我發現MongoDB有點奇怪。MongoDB VS MySQL - 爲什麼mongo/mongoose會自動創建數據庫和集合?

舉例來說,我有創建的數據庫還,但:

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 

蒙戈控制檯:

> show dbs 
kittendb 0.203125GB 
local 0.078125GB 
> use kittendb 
switched to db kittendb 
> db.kittens.find() 
{ "__v" : 0, "_id" : ObjectId("5768e747cf72dd364e7b2fdf"), "name" : "fluffy" } 

那麼,什麼是怎麼回事蒙戈或貓鼬?它究竟是如何知道將小貓拯救到小貓集合,我還沒有創建!??

我錯過了什麼?

+0

Mongodb不是mysql.Application sql體驗到nosql db是不公平的,在許多情況下會導致意想不到的結果。 [The docs](https://docs.mongodb.com/manual/reference/method/db.collection.insert/#create-collection)明確指出集合是在第一次插入時創建的。 –

回答

2

它究竟是如何知道將小貓保存到小貓集合我還沒有創建!

是貓鼬使用的命名方案是基於模型的名字:

var Kitten = mongoose.model('Kitten', kittySchema); 

該模型被命名爲「小貓」。默認情況下,貓鼬會將小寫字母小寫並複數化(因此「小貓」變成「小貓」)並將其用作集合名稱。至於MongoDB爲什麼/如何自動創建數據庫/集合:這是MongoDB創建者所做的設計決定。因爲MongoDB中的數據庫和集合是無模式的,所以不需要有明確的CREATE操作(儘管創建某些特殊類型的集合,MongoDB確實有一個db.createCollection()命令)。

+0

感謝您的回答和很好的解釋! – laukok

+0

順便說一句,什麼是無模式和模式 - 它們之間有什麼區別? – laukok

+1

@ teelou無模式基本上意味着它不需要您創建表,就像使用SQL一樣,並且插入到集合中的文檔不必相似。 – robertklep

相關問題