您好,我需要在 mongoose 库中继承我的模式。有完整的插件吗?或者我自己应该怎么做?
我还需要从 Base 模式继承所有 pre、post、init 中间件。
您好,我需要在 mongoose 库中继承我的模式。有完整的插件吗?或者我自己应该怎么做?
我还需要从 Base 模式继承所有 pre、post、init 中间件。
对于其他寻求此功能的人,Mongoose 3.8 现在具有通过鉴别器功能的模式继承:
您可能想看看使用 Mongoose 插件:
一个可以“开箱即用”的插件在这里:
我知道这是一个老歌,但我来到这里寻找同一个问题的答案,最终做了一些不同的事情。我不想使用鉴别器,因为所有文档都存储在同一个集合中。
模型库.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;
};
新模型.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 用于要使用相同字段/选项/等的其他模型。在我的项目中,我把时间戳放在那里。
Schema.add 在 Schema 构造函数中被调用,因此模型应该像在原始构造函数调用中发送所有字段一样进行组装。
如果你想使用不同的集合:
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
这是使用此框架扩展 shemas 的示例:
首先在一个新的“rode model”中定义你的模式:
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
}
});
但是请记住从框架 github 中提取的此注释:“两个模型将在 MongoDB 上共享相同的集合。扩展模型的文档将具有一个属性 _type 来区分。”