Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongoose—强制集合名称_Mongodb_Mongoose - Fatal编程技术网

Mongodb Mongoose—强制集合名称

Mongodb Mongoose—强制集合名称,mongodb,mongoose,Mongodb,Mongoose,我正在尝试使用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创建一个数据库和其中的一个集合。我的代码是:

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();
当我运行这段代码时,mongoose创建了名为UserInfo而不是UserInfo的集合。 如何在mongoose中强制使用集合名称?

这样就可以了

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

有关更多信息,请参阅Mongoose文档。

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

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

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

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

mongoose.model的API结构如下:

Mongoose#model(name, [schema], [collection], [skipInit])
mongoose所做的是,当没有传递集合参数时,mongoose通过将模型名称复数化来生成集合名称。如果不喜欢此行为,请传递集合名称或设置schemas集合名称选项

例如:

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


默认情况下,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();

这里是猫鼬维护者。我们建议使用
mongoose.model('UserInfo',UserInfo',UserInfo')
,mongoose.model()的第三个参数是集合名称

您的型号名称:userInfo.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserInfo = new Schema({
 username : String,
 password : String 
});
module.exports = mongoose.model('UserInfo', UserInfo);
在express route文件或app.js中

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/testdb');
然后在你的userInfo.js中

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserInfo = new Schema({
 username : String,
 password : String 
});
module.exports = mongoose.model('UserInfo', UserInfo);

回答:

mongoose.model('UserInfo', UserInfo, 'userinfo'); //3rd parameter 'userinfo': as collection name
更好的语法解释:

参数说明:

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

module.exports=mongoose.model('name',schema,'collection')上传递第三个参数
将根据已回答的模型名称覆盖自动集合名称。。但还有两种方式

根据mongoose.model doco链接:

有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)

谢谢你。以下是相关链接:谢谢@JonPage,我想知道为什么我收集的Person对象被命名为people。你提供的链接是一个很好的参考。我认为这种在创建模式时设置自定义集合名称的方法比在创建模型时定义集合名称的方法要好。这非常有用。我花了两天的时间试图询问一些事情。这是最好的建议。我总是发现在mongoose.model()中传递集合名称最简单。这也很好地指出了猫鼬是如何将收藏名称复数化的,这在我刚开始的时候让人困惑。有趣的事实:猫鼬知道牛的复数是牛,但goose的复数形式并不是geese。这是在模型级别声明自定义集合名称的完美方式。这个答案并没有说明它在2.0.0之前是否仍然有效,或者是否从2.0.0开始实施。
Mongoose.model(name, [schema], [collection], [skipInit])
var schema = new Schema({ name: String }, { collection: 'actor' });

// or

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

// or

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