2011-09-20 80 views
83

我正在嘗試使用貓鼬在其中創建一個數據庫和一個集合。我的代碼是:貓鼬 - 強制收集名稱

var mongoose = require('mongoose'); 
    var db = mongoose.connect('mongodb://localhost/testdb'); 
    var Schema = mongoose.Schema; 

    var UserInfo = new Schema({ 
    username : String, 
    password : String 
    }); 

    mongoose.model('UserInfo', UserInfo); 

    var user = db.model('UserInfo'); 


    var admin = new user(); 
    admin.username = "sss"; 
    admin.password = "ee"; 
    admin.save(); 

當我運行這段代碼,貓鼬創建的集合命名,而不是用戶信息的UserInfo。 如何在貓鼬中強制收集名稱?

回答

135

這應該這樣做

var UserInfo = new Schema({ 
    username : String, 
    password : String 
}, { collection: 'userinfo' }); 
+6

感謝您的支持。以下是相關鏈接:http://mongoosejs.com/docs/guide.html#collection –

+0

感謝@JonPage,我想知道爲什麼我的Person對象集合被命名爲people。您提供的鏈接是一個很好的參考。我認爲創建模式時設置自定義集合名稱的方法比創建模型時定義集合名稱的其他方法要好。 – Bharat

54

如果使用的是貓鼬2.0.0,通過集合名作爲第三個參數

mongoose.model('UserInfo', UserInfo, 'UserInfo'); 
+2

也適用於貓鼬4.7.6 –

8

你需要在你的架構設置的集合名稱。 mongoose.model的

new Schema({...},{collection: 'userInfo'}); 
9

API的結構是這樣的:

Mongoose#model(name, [schema], [collection], [skipInit]) 

什麼貓鼬做的是,當沒有收集參數傳遞,貓鼬由複數化模型名稱產生一個集合名稱。如果您不喜歡這種行爲,請傳遞集合名稱或設置您的模式集合名稱選項。

例子:

var schema = new Schema({ name: String }, { collection: 'actor' }); 

schema.set('collection', 'actor'); 

var collectionName = 'actor' 
var M = mongoose.model('Actor', schema, collectionName); 
9

貓鼬會默認加上 's' 來集合名稱。如果你想避免只是通過第三個參數作爲集合名稱

var mongoose = require('mongoose'); 
     var db = mongoose.connect('mongodb://localhost/testdb'); 
     var Schema = mongoose.Schema; 

     var UserInfo = new Schema({ 
     username : String, 
     password : String 
     }); 

     mongoose.model('UserInfo', UserInfo, 'UserInfo') 

    tan = new user(); 
     admin.username = "sss"; 
     admin.password = "ee"; 
     admin.save(); 
+0

這是最好的建議。我總是發現它是在mongoose.model()中傳遞集合名稱最簡單的方法。也很好地指出貓鼬如何將收藏品名稱複數化,這在我剛開始時很混亂。 –