使用 Mongoose 进行虚拟填充

Posted

技术标签:

【中文标题】使用 Mongoose 进行虚拟填充【英文标题】:Virtual populate with Mongoose 【发布时间】:2020-12-08 12:24:23 【问题描述】:

我有以下 shema,如何从 Media 填充文档以获取教育、经验和认证?我尝试了很多方法,但都不起作用。

const mongoose = require('mongoose');

exports.User = schema => 
  schema.add(
    username: 
      type: String,
      index: true
    ,
    education: [
      
        title: String,
        description: String,
        year: String,
        verified: Boolean,
        documentId: mongoose.Schema.Types.ObjectId
      
    ],
    experience: [
      
        title: String,
        description: String,
        year: String,
        verified: Boolean,
        documentId: mongoose.Schema.Types.ObjectId
      
    ],
    certification: [
      
        title: String,
        description: String,
        year: String,
        verified: Boolean,
        documentId: mongoose.Schema.Types.ObjectId
      
    ]
  );
  schema.set('toObject',  virtuals: true );
  schema.set('toJSON',  virtuals: true );
;

【问题讨论】:

【参考方案1】:

您可以使用路径属性进行深度链接,这也适用于数组类型。

第 1 步: 将 documentId 字段的架构如下更改为 define 参考媒体收藏

documentId:  type: mongoose.ObjectId, ref: 'Media' ,

第 2 步: 在架构上定义虚拟属性

schema.virtual('educationDocument',    
    ref: 'Media', // the collection/model name
    localField: 'education.documentId',
    foreignField: '_id',
    justOne: true, // default is false );

第 3 步:使用 mongoose 填充路径定义进行深度链接

const users = await User.find()
    .populate( path: 'educationDocument' )
    .populate( path: 'experienceDocument' )
    .populate( path: 'certificationDocument' )
    .execPopulate()

【讨论】:

谢谢,但教育是一个数组。教育:[标题:字符串,描述:字符串,年份:字符串,验证:布尔,documentId:mongoose.Schema.Types.ObjectId] 它也应该适用于数组类型。或者您可以尝试 const users = await User.find() .populate( path: 'education.documentId' ) 而不使用虚拟,只需确保您在步骤 1 中定义架构【参考方案2】:

查看populate

const users = await User.find().populate('education').populate('experience').populate('certification')

【讨论】:

感谢您的回答,但我需要按教育、经验或认证的 documentId 填充 Document。你有更多的解决方案吗? ==> 检查这个:documentId: mongoose.Schema.Types.ObjectId

以上是关于使用 Mongoose 进行虚拟填充的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 使用多个本地/外键对填充虚拟

Mongoose 虚拟填充返回 null

mongoose基本增删改查

使用 mongoose 访问现有的 mongodb 集合

使用 mongoose 访问现有的 mongodb 集合

虚拟填充猫鼬