Mongoose使用結構化的模式應用到MongoDB集合,為MongoDB Node.js原生驅動程序提供了更多的功能和簡化了數據庫操作。
從創建連接到向數據庫中寫入一個條數據經歷了以下步驟:
1.連接數據庫,並創建連接;
2.定義UserSchema(相當於數據庫建表) ;
3.創建User模型(相當於構建對象和數據庫表映射);
4.通過User模塊,創建對象
5.通過save方法持久化對象;
(參考博客:Mongoose在創建Model時對Collection的命名策略http://www.tuicool.com/articles/R36bMbA)
如下代碼就可以在數據庫中創建一個 users ( 為什么是users是本文的重點 ) 集合並插入一條文檔:
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 });
分析一下上面的代碼,有幾個問題(坑)需要注意:
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, 說明上述的命名規則是正確的。
總結一下: