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


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

 

總結一下: 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM