Mongoose - 强制集合名称

rav*_*avi 109 mongoose mongodb

我正在尝试使用mongoose来创建数据库和集合.我的代码是:

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();
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,mongoose创建了名为UserInfo而不是userinfo的集合.如何在mongoose中强制收集名称?

Tho*_*aum 180

这应该做到这一点

var UserInfo = new Schema({
  username : String,
  password : String 
}, { collection: 'userinfo' });
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Mongoose文档中的此链接.

  • 谢谢你.以下是相关链接:http://mongoosejs.com/docs/guide.html#collection (7认同)
  • 谢谢@JonPage,我想知道为什么我的 Person 对象集合被命名为人。您提供的链接是一个很好的参考。我认为这种在创建模式时设置自定义集合名称的方法比创建模型时定义集合名称的其他方法更好。 (2认同)

Bil*_*ain 76

如果您使用的是mongoose 2.0.0,请将collectionName作为第三个参数传递

mongoose.model('UserInfo', UserInfo, 'UserInfo');
Run Code Online (Sandbox Code Playgroud)


小智 20

默认情况下,Mongoose会将'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();
Run Code Online (Sandbox Code Playgroud)


Sim*_*ran 11

mongoose.model的API结构是这样的:

Mongoose#model(name, [schema], [collection], [skipInit])
Run Code Online (Sandbox Code Playgroud)

mongoose做的是,当没有传递集合参数时,Mongoose通过复制模型名称来生成集合名称.如果您不喜欢此行为,请传递集合名称或设置模式集合名称选项.

例:

var schema = new Schema({ name: String }, { collection: 'actor' });
Run Code Online (Sandbox Code Playgroud)

要么

schema.set('collection', 'actor');
Run Code Online (Sandbox Code Playgroud)

要么

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);
Run Code Online (Sandbox Code Playgroud)


vka*_*v15 10

猫鼬维护者在这里.我们建议做mongoose.model('UserInfo', UserInfo, 'UserInfo');,第三个arg mongoose.model()是集合名称.这是相关的文档.


Jam*_*und 9

您需要在架构中设置集合名称.

new Schema({...},{collection: 'userInfo'});
Run Code Online (Sandbox Code Playgroud)


小智 8

传递第三个参数会module.exports = mongoose.model('name', schema, 'collection')覆盖基于模型名称的自动集合名称,这已经被回答了..但是还有其他两种方法,

每个 mongoose.model doco 链接: https://mongoosejs.com/docs/api.html#mongoose_Mongoose-model

有3种方法可以手动输入集合名称:

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

// or

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

// or

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName)
Run Code Online (Sandbox Code Playgroud)


小智 5

回答:

mongoose.model('UserInfo', UserInfo, 'userinfo'); //3rd parameter 'userinfo': as collection name
Run Code Online (Sandbox Code Playgroud)

更好的语法解释:

Mongoose.model(name, [schema], [collection], [skipInit])
Run Code Online (Sandbox Code Playgroud)

参数说明:

  • 第一个参数 - 名称 型号名称
  • 第二个参数 [schema] 架构名称
  • 第三个参数[collection]集合名称(可选,从模型名称导出)
  • 第4个参数[skipInit]是否跳过初始化(默认为false)