我在模式的toObject
中添加了一个转换函数来删除某些属性,并将_id
的名称更改为id
。当我对结果使用findOne
并调用toObject
时,它工作得很好,但我也有一个find({}, (err, items) => {...})
命令。无法对数组调用toObject
。
这是我的方案:
var ItemSchema = new Schema({
version: {type: String, default: '1.0.0'},
created: {type: Date, default: Date.now},
modified: {type: Date, default: Date.now},
properties: Schema.Types.Mixed
}, {
toObject: {
transform: (doc, ret) => {
// remove the _id and __v of every document before returning the result
ret.id = doc.id;
delete ret._id;
delete ret.__v;
}
}
});
我查过了,只能找到this question,这里推荐的答案是使用
lean()
——这对我没有帮助。作为一种解决方法,我添加了一行
var result = items.map(x => x.toObject());
,虽然它工作得很好,但我想知道是否有方法在返回的任何文档(单个文档或数组)上自动触发转换,因此我不必迭代结果。 最佳答案
我已经创建了一个Mongoose插件来做这样的事情。
var cleanup = function (schema) {
var toJSON = schema.methods.toJSON || mongoose.Document.prototype.toJSON;
schema.set('toJSON', {
virtuals: true
});
schema.methods.toJSON = function () {
var json = toJSON.apply(this, arguments);
delete json._id;
delete json.__t;
delete json.__v;
return json;
};
};
基本上,它覆盖
toJSON
(尽管您也可以使用toObject
)。顺便说一下,已经有了一个由mongoose定义的
id
虚拟属性(除非在schema选项中将id
设置为false
)。我就是这么用的:
ItemSchema.plugin(cleanup);