Здравствуйте, мне нужно наследовать мои схемы в библиотеке mongoose. Есть ли для этого плагины? Или как мне это сделать?
Мне нужно наследовать все pre, post, промежуточное ПО init из базовой схемы.
Здравствуйте, мне нужно наследовать мои схемы в библиотеке mongoose. Есть ли для этого плагины? Или как мне это сделать?
Мне нужно наследовать все pre, post, промежуточное ПО init из базовой схемы.
Возможно, вам захочется взглянуть на использование плагина Mongoose:
Плагин, который делает то, что вы хотите "из коробки", находится здесь:
Для других, ищущих эту функциональность, у Mongoose 3.8 теперь есть Наследование схемы через Функцию Дискриминатора:
Я знаю, что это старина, но я приехал сюда, ища ответ на тот же вопрос, и в итоге сделал что-то совсем другое. Я не хочу использовать дискриминаторы, потому что все документы хранятся в одной коллекции.
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 вызывается в конструкторе схемы, поэтому модель должна быть собрана так, как если бы все поля были отправлены в исходном вызове конструктора.
Если вы хотите использовать разные коллекции:
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}
});
Проверьте модели этой структуры для 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 для дифференциации".