Mongoose在向集合中插入文檔時的集合命名問題

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, 說明上述的命名規則是正確的。

 

總結一下: 

相關文章
相關標籤/搜索