我的Post模式中有一个标签数组:
tags: [ { type: Schema.Types.ObjectId, ref: 'Tag' } ],
标签看起来像这样:
{ name: String }
当我填充tags
数组时,它当然填充了标记对象文字。
我有没有办法让mongoose只用标签中的name
字符串填充数组?
我只尝试指定名称,但在对象文字中返回name
。
目前人口产出:
[ { name: 'React' }, { name: 'JavaScript' } ]
但我希望如此:
[ 'React', 'JavaScript']
有没有办法用Mongoose做到这一点?
答案 0 :(得分:0)
您可以使用' post' Query Middleware功能。在Model.find()或Model.findOne()查询返回实际数据之前,将触发此函数。在函数内部,您可以使用Array.map将数据转换为所需的格式。
schema.post('findOne', function(doc) {
// Transform the doc here.
// Example:
// doc.tags = doc.tags.map(tag => tag.name);
});
你也可以这样做来处理Model.find()。
schema.post('find', function(docs) {
// Transform the doc here.
// Example:
// docs = docs.map(doc => {
// doc.tags = doc.tags.map(tag => tag.name);
// return doc;
// });
});
答案 1 :(得分:0)
您可以使用返回标记数组缩减的虚拟:
schema.virtual('plainTags').get(function () {
// first, validate if the 'tags' path is populated
if (!this.populated('tags')) {
return this.tags
}
return this.tags.reduce(function(col, Tag) {
col.push(Tag.name) return col
}, [])
})