Короткого ответа: написать мангуст плагин.
Длинный ответ:
Вы можете добавить дополнительные атрибуты схемы, которые вы хотите. Вы вообще пишете плагин Mongoose , чтобы на самом деле что-то с ними сделать. Примером этого может быть в mongoose-hidden плагин, который позволяет определить некоторые из ваших полей, как скрытой во время преобразования:
var userSchema = new mongoose.Schema({
name: String,
password: { type: String, hide: true }
});
userSchema.plugin(require('mongoose-hidden'));
var User = mongoose.model('User', userSchema, 'users');
var user = new User({ name: 'Val', password: 'pwd' });
// Prints `{ "name": "Val" }`. No password!
console.log(JSON.stringify(user.toObject()));
Обратите внимание на атрибут на password:
поле hide: true
. Плагин переопределяет функцию toObject()
, и пользовательская версия удаляет ищет атрибут и удаляет это поле.
Вот тело плагина. Строка # 4 выглядит проверяет существование schemaType.options.hide
атрибута:
function HidePlugin(schema) {
var toHide = [];
schema.eachPath(function(pathname, schemaType) {
if (schemaType.options && schemaType.options.hide) {
toHide.push(pathname);
}
});
schema.options.toObject = schema.options.toObject || {};
schema.options.toObject.transform = function(doc, ret) {
// Loop over all fields to hide
toHide.forEach(function(pathname) {
// Break the path up by dots to find the actual
// object to delete
var sp = pathname.split('.');
var obj = ret;
for (var i = 0; i < sp.length - 1; ++i) {
if (!obj) {
return;
}
obj = obj[sp[i]];
}
// Delete the actual field
delete obj[sp[sp.length - 1]];
});
return ret;
};
}
Моя точка ...
... если вы пишете мангуста плагин (например, может быть «MinLengthPlugin»), вы можете повторно использовать это на всех своих схемах без написания дополнительного кода. В плагине вы могли переопределить функциональность что-то вроде:
module.exports = function MinLenghPlugin (schema, options) {
schema.pre('save', myCustomPreSaveHandler);
var myCustomPreSaveHandler = function() {
// your logic here
}
};