Mongoose -- Force collection name
MongodbMongooseMongodb Problem Overview
I am trying to use mongoose to create a database and a collection in it. My code is:
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();
When I run this code, mongoose created collection named UserInfo instead of userinfo. How to force collection name in mongoose?
Mongodb Solutions
Solution 1 - Mongodb
This should do it
var UserInfo = new Schema({
username : String,
password : String
}, { collection: 'userinfo' });
See this link from the Mongoose documentation for more information.
Solution 2 - Mongodb
If you are using mongoose 2.0.0, pass the collectionName as the third argument
mongoose.model('UserInfo', UserInfo, 'UserInfo');
Solution 3 - Mongodb
Mongoose will add 's' to collection name by default. If you want to avoid that, just pass as third argument the name of the collection:
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();
Solution 4 - Mongodb
API structure of mongoose.model is this:
Mongoose#model(name, [schema], [collection], [skipInit])
What mongoose do is that, When no collection argument is passed, Mongoose produces a collection name by pluralizing the model name. If you don't like this behavior, either pass a collection name or set your schemas collection name option.
Example:
var schema = new Schema({ name: String }, { collection: 'actor' });
or
schema.set('collection', 'actor');
or
var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);
Solution 5 - Mongodb
You need to set the collection name in your schema.
new Schema({...},{collection: 'userInfo'});
Solution 6 - Mongodb
Mongoose maintainer here. We recommend doing mongoose.model('UserInfo', UserInfo, 'UserInfo');
, third arg to mongoose.model()
is the collection name. Here's the relevant docs.
Solution 7 - Mongodb
Passing a third argument on module.exports = mongoose.model('name', schema, 'collection')
overrides the automatic collection name based on model name, which has already been answered.. but there are 2 other ways,
per mongoose.model doco link: https://mongoosejs.com/docs/api.html#mongoose_Mongoose-model
there are 3 methods to manually enter a collection name:
var schema = new Schema({ name: String }, { collection: 'actor' });
// or
schema.set('collection', 'actor');
// or
var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName)
Solution 8 - Mongodb
Answer:
mongoose.model('UserInfo', UserInfo, 'userinfo'); //3rd parameter 'userinfo': as collection name
> Better explanation with syntax:
Mongoose.model(name, [schema], [collection], [skipInit])
Parameters Explanation:
- 1st parameter - name
model name - 2nd parameter [schema]
schema name - 3rd parameter [collection]
collection name (optional, induced from model name) - 4th parameter [skipInit]
whether to skip initialization (defaults to false)
Solution 9 - Mongodb
your model name : userInfo.js
in express route file or app.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/testdb');
then in your userInfo.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserInfo = new Schema({
username : String,
password : String
});
module.exports = mongoose.model('UserInfo', UserInfo);