MMR
MMR

Reputation: 3009

How to declare collection name and model name in mongoose

I have 3 kind of records,

1)Categories,
2)Topics  and
3)Articles 

In my mongodb, i have only 1 colection named 'categories' in which i stroe the above 3 types of documents.

For these 3 modules,i wrote 3 models(one each) in such a way like below,

mongoose.model('categories', CategorySchema);
mongoose.model('categories', TopicSchema)
mongoose.model('categories', ArticlesSchema)

like....mongoose.model('collection_name', Schema_name)

but when i run my code ,it throws error that

Cannot overwrite `categories` model once compiled.

If i change the above models like this,

mongoose.model('category','categories', CategorySchema);
mongoose.model('topics','categories', TopicSchema)
mongoose.model('articles','categories', ArticlesSchema)

It is creating 2 collections named topics and articles which i dont want. This is my issue right now,can anyone suggest me help.....Thanks....

Upvotes: 17

Views: 32998

Answers (5)

prashanthh
prashanthh

Reputation: 21

mongoose.model() method takes arguments in the following order,

name: string,
schema: Schema, 
collection?: string, 
skipInit?: Boolean

Example:

mongoose.model('todoModel','todoSchema', 'todoCollection');

Upvotes: 0

Christopher Nolan
Christopher Nolan

Reputation: 1107

As you stated, When you write this,

mongoose.model('categories', CategorySchema);
mongoose.model('categories', TopicSchema);
mongoose.model('categories', ArticlesSchema);

The output becomes inappropriate so do this instead,

mongoose.model('category', CategorySchema);
mongoose.model('topic', TopicSchema);
mongoose.model('article', ArticlesSchema);

Bonus tip. Mongoose makes your collection name plural by default so change a little code if you want your collection name as you wrote.

mongoose.model('category', CategorySchema,'category');
mongoose.model('topic', TopicSchema,'topic');
mongoose.model('article', ArticlesSchema,'article');

Upvotes: 7

Marcelo Ramos
Marcelo Ramos

Reputation: 1

You can use Mongoose Discriminators (http://mongoosejs.com/docs/discriminators.html) for that.

This article has a good and easy example of how to do that: https://learn.microsoft.com/en-us/azure/cosmos-db/mongodb-mongoose#using-mongoose-discriminators-to-store-data-in-a-single-collection.

Upvotes: 0

prasanthv
prasanthv

Reputation: 2492

"The first argument is the singular name of the collection your model is for. Mongoose automatically looks for the plural version of your model name" - directly from the Model docs -- https://mongoosejs.com/docs/models.html

Upvotes: 4

saurav
saurav

Reputation: 1002

Try-

mongoose.model('category', CategorySchema, 'categories');
mongoose.model('topics', TopicSchema, 'categories');
mongoose.model('articles', ArticlesSchema, 'categories');

As mentioned in docs: http://mongoosejs.com/docs/api.html#index_Mongoose-model

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

Defines a model or retrieves it.

Parameters:

  • 1st param - name <String> model name
  • 2nd param - [schema] <Schema> schema name
  • 3rd param - [collection] <String> collection name (optional, induced from model name)
  • 4th param - [skipInit] <Boolean> whether to skip initialization (defaults to false)

See - https://stackoverflow.com/a/14454102/3896066

Upvotes: 53

Related Questions