Skip to content Skip to sidebar Skip to footer

Inheritance In Mongoose

Hello I need to inherit my schemas in mongoose library. Are there complete plugins for that? Or how should I do that myself? I need to inherit all pre, post, init middleware from a

Solution 1:

For others looking for this functionality, Mongoose 3.8 now has Schema Inheritance via Discriminator functionality:

https://github.com/LearnBoost/mongoose/pull/1647

Solution 2:

You may want to look at using a Mongoose Plugin:

A plugin that does what you want 'out of the box' is here:

Solution 3:

I know this is an oldie, but I arrived here looking for the answer to the same question and ended up doing something a little different. I don't want to use discriminators because all the documents are stored in the same collection.

ModelBase.js

var db = require('mongoose');

module.exports = function(paths) {
    var schema = new db.Schema({ 
        field1: { type: String, required: false, index: false },
        field2: { type: String, required: false, index: false } 
    }, { 
        timestamps: { 
            createdAt: 'CreatedOn', 
            updatedAt: 'ModifiedOn' 
        } 
    });

    schema.add(paths);

    return schema;
};

NewModel.js

var db = require('mongoose');
var base = require('./ModelBase');
var schema = newbase({
    field3: { type: String, required: false, index: false },
    field4: { type: String, required: false, index: false }
});

db.model('NewModelItem', schema, 'NewModelItems');

All 4 fields will be in NewModelItem. Use ModelBase for other models where you want to use the same fields/options/etc. In my project I put the timestamps in there.

Schema.add is called in the Schema constructor so the model should be assembled as if all the fields were sent in the original constructor call.

Solution 4:

If you want to use different collections:

functionextendSchema (Schema, definition, options) {
  returnnew mongoose.Schema(
    Object.assign({}, Schema.obj, definition),
    options
  );
}

Usage:

const UserSchema = new mongoose.Schema({
  firstname: {type: String},
  lastname: {type: String}
});

const ClientSchema = extendSchema(UserSchema, {
  phone: {type: String, required: true}
});

https://www.npmjs.com/package/mongoose-extend-schema

Solution 5:

Check the models of this framework for Mongoose:

https://github.com/marian2js/rode#models-with-mongoose

This is an example of who to extend shemas with this framework:

First of all define your schema inside a new "rode model":

var rode = require('rode');

varUser = rode.Model.extend({
  name: 'User',
  schema: {
    name: {
      type: 'String',
      unique: true
    },
    email: String,
    password: String
  }
});

Now you should call extend method:

varAdmin = User.extend({
  name: 'Admin',
  // The schema for admins is the schema for users + their own schemaschema: {
    lastAccess: Date
  }
});

But have in mint this note extracted from the framework github: "Both models will share the same collection on MongoDB. Documents of the extended models will have an attribute _type to differentiate."

Post a Comment for "Inheritance In Mongoose"