André
André

Reputation: 783

Mongoose: Populate referenced SubDocument

I've the following schemas:

Occurence that references a competence in the CostCenter subdocuments competences.

const OccurrenceSchema = new mongoose.Schema({
  date: {
    type: Date,
    default: Date.now,
  },
  competence: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'CostCenter.competences',
  },
  ...
})

CostCenter where I've an array of subdocuments that can be ref by Occurence.

const CostCenterSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    trim: true,
  },
  competences: [CompetenceSchema],
});

And finally the Competence.

const CompetenceSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    trim: true,
  },
});

When I try to populate the competence, I get "Schema hasn't been registered for model \"CostCenter.competences\".\nUse mongoose.model(name, schema)".

const occurrence_list = (request, response) => {
  Occurrence.find()
    .populate('occurrence origin tag entity method priority competence')
    .then(occurrences => response.send(occurrences))
    .catch(e => response.send(e));
};

How can I possibly populate the occurrence when referencing a subdocument?

Upvotes: 0

Views: 196

Answers (1)

dnp1204
dnp1204

Reputation: 481

First, you need to change your Occurrence model to this

const OccurrenceSchema = new mongoose.Schema({
   date: { type: Date, default: Date.now },
   competence: { type: mongoose.Schema.Types.ObjectId, ref:'CostCenter' }
});
mongoose.model('Occurrence', OccurrenceSchema);

and CostCenter model:

const CostCenterSchema = new mongoose.Schema({
   name: { type: String, required: true, trim: true },
   competences:[{ type: mongoose.Schema.Types.ObjectId, ref: 'Competence' }],
});
mongoose.model('CostCenter', CostCenterSchema);

finally Competence model:

const CompetenceSchema = new mongoose.Schema({
   name: { type: String, required: true, trim: true }
});
mongoose.model('Competence', CompetenceSchema);

To populate the competence from Occurrence, you can do so:

Occurrence.find({ your_query })
.populate('competence')
.then(occurrences => response.send(occurrences))
.catch(e => response.send(e));

Hope it helps!

Upvotes: 1

Related Questions