Mongoose -使用引用属性填充数组

of1yzvn4  于 11个月前  发布在  Go
关注(0)|答案(3)|浏览(106)

我在Post schema中有一个Tags数组:
1x个月
标签看起来像这样:
{ name: String }
当我填充tags数组时,它当然是用标记对象文字填充的。
有没有一种方法可以让mongoose只使用标签中的name字符串填充数组?
我尝试只指定名称,但是name在对象文字中返回。
目前人口产出:
[ { name: 'React' }, { name: 'JavaScript' } ]
但我希望是:
[ 'React', 'JavaScript']
有没有办法用Mongoose做到这一点?

djmepvbi

djmepvbi1#

您可以使用'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;
    // });
});

jfewjypa

jfewjypa2#

你可以使用一个虚拟的返回一个减少的标签数组:

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

字符串

iqjalb3h

iqjalb3h3#

你要找的是填充“转换”选项。
您可以为正在填充的每个文档触发一个函数,对于您的用例,它看起来像这样:

item = await Parent.findById("_id").populate([{
  path: 'tags',
  transform: (document, id) => document == null ? null : document.name
}]);

字符串

相关问题