是否可以在Mongoose架构中向字段添加额外/自定义属性?例如,请注意以下字段中的name:
属性:
var schema = mongoose.Schema({
_id : { type: String, default: $.uuid.init },
n : { type: String, trim: true, name: 'name' },
ac : { type: Date, required: true, name: 'created' },
au : { type: Date, name: 'updated' },
ad : { type: Date, name: 'deleted' },
am : { type: String, ref: 'Member', required: true, name: 'member' }
});
我们希望系统中有大量文档,并希望尽可能多地保留空间。在此示例中,我们缩写了字段的名称(n
vs name
等)。我们希望在获取后使用额外的name
字段来水合JSON对象。
答案 0 :(得分:0)
您可以创建一个实例方法(我称之为toMappedObject
,但您可以自由命名,但是您喜欢)可以通过检查每个字段的架构来执行转换,看它是否有一个name
属性:
schema.methods.toMappedObject = function() {
let obj = this.toObject();
Object.keys(obj).forEach(fieldName => {
let field = schema.tree[fieldName];
if (field.name) {
obj[field.name] = obj[fieldName];
delete obj[fieldName];
}
});
return obj;
}
// Example usage:
let doc = new Model({...});
let obj = doc.toMappedObject();
或者,您可以将架构配置为自动转换toJSON
生成的输出,虽然它更隐含,因此容易忽略以防问题出现(我还没有对此进行测试)非常好):
schema.set('toJSON', {
transform : function(doc, obj) {
Object.keys(obj).forEach(fieldName => {
let field = doc.schema.tree[fieldName];
if (field.name) {
obj[field.name] = obj[fieldName];
delete obj[fieldName];
}
});
return obj;
}
});
// Example usage:
let doc = new Model({...});
console.log('%j', doc); // will call `doc.toJSON()` implicitly