我已向模式的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());
,虽然效果很好,但我想知道是否有办法在返回的任何文档上自动触发转换 - 单个或数组,所以我不必迭代结果。
答案 0 :(得分:1)
我已经创建了一个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
执行相同操作。)
顺便说一句,已经有一个id
虚拟属性,由mongoose定义(除非你在架构选项中将id
设置为false
。
我这样使用它:
ItemSchema.plugin(cleanup);
答案 1 :(得分:0)
好吧,看了一会儿之后,我终于决定将结果转换为对象了。正如问题所述,我不是return items;
return items.map(x => x.toObject());