Populate virtuel avec Mongoose

Aug 19 2020

J'ai le shema suivant, comment remplir le document de Media pour l'éducation, l'expérience et la certification? J'ai essayé de nombreuses façons mais cela ne fonctionne pas.

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 });
};

Réponses

AlpeshPatil Aug 26 2020 at 19:58

Vous pouvez utiliser l'attribut path pour les liens profonds, cela fonctionnerait également pour les types Array.

Étape 1: Modifiez le schéma du champ documentId comme ci-dessous pour définir une référence à la collection de médias

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

Étape 2: définir les propriétés virtuelles sur le schéma

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

Étape 3: Utilisez le remplissage de mangouste avec la définition de chemin pour les liens profonds

const users = await User.find({})
    .populate({ path: 'educationDocument' })
    .populate({ path: 'experienceDocument' })
    .populate({ path: 'certificationDocument' })
    .execPopulate()
Tahero Aug 19 2020 at 10:49

vérifier peupler

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