Наследование в мангусте - программирование

Наследование в мангусте

Здравствуйте, мне нужно наследовать мои схемы в библиотеке mongoose. Есть ли для этого плагины? Или как мне это сделать?

Мне нужно наследовать все pre, post, промежуточное ПО init из базовой схемы.

4b9b3361

Ответ 2

Для других, ищущих эту функциональность, у Mongoose 3.8 теперь есть Наследование схемы через Функцию Дискриминатора:

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

Ответ 3

Я знаю, что это старина, но я приехал сюда, ища ответ на тот же вопрос, и в итоге сделал что-то совсем другое. Я не хочу использовать дискриминаторы, потому что все документы хранятся в одной коллекции.

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 = new base({
    field3: { type: String, required: false, index: false },
    field4: { type: String, required: false, index: false }
});

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

Все 4 поля будут в NewModelItem. Используйте ModelBase для других моделей, где вы хотите использовать те же поля/параметры/etc. В моем проекте я помещал там временные метки.

Schema.add вызывается в конструкторе схемы, поэтому модель должна быть собрана так, как если бы все поля были отправлены в исходном вызове конструктора.

Ответ 4

Если вы хотите использовать разные коллекции:

function extendSchema (Schema, definition, options) {
  return new mongoose.Schema(
    Object.assign({}, Schema.obj, definition),
    options
  );
}

Использование:

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

Ответ 5

Проверьте модели этой структуры для Mongoose:

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

Это пример того, кто должен расширять эти рамки:

Прежде всего, определите свою схему внутри новой "модели роуд":

var rode = require('rode');

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

Теперь вы должны вызвать метод extend:

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

Но в mint это примечание извлечено из фреймворка github: "Обе модели будут совместно использовать одну и ту же коллекцию в MongoDB. Документы расширенных моделей будут иметь атрибут _type для дифференциации".