Mongoose使用結構化的模式應用到MongoDB集合,爲MongoDB Node.js原生驅動程序提供了更多的功能和簡化了數據庫操做。mongodb
從建立鏈接到向數據庫中寫入一個條數據經歷瞭如下步驟:數據庫
1.鏈接數據庫,並建立鏈接;mongoose
2.定義UserSchema(至關於數據庫建表) ;ui
3.建立User模型(至關於構建對象和數據庫表映射);spa
4.經過User模塊,建立對象code
5.經過save方法持久化對象;對象
(參考博客:Mongoose在建立Model時對Collection的命名策略http://www.tuicool.com/articles/R36bMbA)blog
以下代碼就能夠在數據庫中建立一個 users ( 爲何是users是本文的重點 ) 集合並插入一條文檔:ip
1 var mongoose = require('mongoose'); 2 var schema = mongoose.Schema; 3 4 // 鏈接MongoDB 5 mongoose.connect("mongodb://localhost:27017"); 6 7 // 定義模式 8 var userSchema = new schema({ 9 name : String, 10 gender : String, 11 age : Number 12 }); 13 14 // 編譯模型 15 var User = mongoose.model('User', userSchema); 16 17 // 新建文檔對象實例 18 var user1 = new User ({ 19 name : "Jack", 20 gender : "male", 21 age : 23 22 }); 23 24 // 將文檔保存到數據庫 25 user1.save(function(err, user1){ 26 if(err){ 27 return console.error(err); 28 }else{ 29 console.info(user1); 30 } 31 });
分析一下上面的代碼,有幾個問題(坑)須要注意:ci
1.鏈接數據庫沒有指定數據庫。
Mongoose鏈接數據庫建議的寫法爲:
mongoose.connect("mongodb://localhsot:port/databaseName");
即在鏈接時指定localhost上的數據庫,若是沒有顯式地指定,則默認鏈接到 MongoDB的 test 數據庫,這一點要注意。
2.定義模式或編譯模型時沒有指定集合。
定義模式的語法是: new Schema( [defination], [options] )
其中defination即文檔中屬性的定義,options爲可指定的選項,包括autoIndex、collection、id、_id、strict等。
通常在定義模式的時候直接指定collection,即須要建立模式的集合名稱,若是不指定,能夠在編譯模型的時候進行指定。
3.編譯模型時沒有指定集合。
編譯模型: model(name, [schema], [colleciton], [skipInit] )
參數: name :標識model的字符串
schema: 即前面定義的Schema對象
collection:要鏈接的集合名稱(若是在Schema對象中沒有指定一個集合)
skipInit: 默認爲false,若是爲true,則跳過初始化過程,建立一個沒有鏈接到數據庫的一個簡單的Model對象。
* 分析上面的代碼,發如今Schema中沒有指定集合,而在模型的定義中也沒有指定集合,那麼新建的文檔將要插入到哪裏呢?
在MongoDB中,若是向一個不存在的集合中插入文檔,則對應的數據庫(默認爲test)會建立一個集合,二Mongoose一樣遵循這個原則,
而且在新建立的數據庫的命名上面也很有講究,
判斷模型名是否可數,若是不可數直接返回模型名做爲新集合的名稱;若是可數,則返回模型名的複數形式做爲新集合的名稱(模型名+'s') ;
爲了驗證上述規則,運行上述的代碼,並查看 test 數據庫中的集合,以下:
經過查詢集合中的文檔能夠發現,新建立的集合名稱爲 users 。
嘗試修改模型名稱爲不可數,好比Fish, 再次運行代碼,查看新建的集合名稱:
能夠發現,此時的集合名稱是fish, 說明上述的命名規則是正確的。
總結一下: