2011-09-20 41 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()中传递集合名称最简单的方法。也很好地指出猫鼬如何将收藏品名称复数化,这在我刚开始时很混乱。 –