Mongoose - 使用引用属性

时间:2016-12-21 20:51:33

标签: javascript node.js mongodb express mongoose

我的Post模式中有一个标签数组:

tags: [ { type: Schema.Types.ObjectId, ref: 'Tag' } ],

标签看起来像这样:

{ name: String }

当我填充tags数组时,它当然填充了标记对象文字。

我有没有办法让mongoose只用标签中的name字符串填充数组?

我只尝试指定名称,但在对象文字中返回name

目前人口产出:

[ { name: 'React' }, { name: 'JavaScript' } ]

但我希望如此:

[ 'React', 'JavaScript']

有没有办法用Mongoose做到这一点?

2 个答案:

答案 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
  }, [])
})