mongoose - ObjectId that references a Sub-Document
Yes it is possible, but you have a few options.
Option 1: C as a Subdocument
If you really want to use subdocuments, you don't need to create a separate model. You need to change your reference to the 'c' array.
var C = new Schema({...}); var B = new Schema({c: [C]}); var A = new Schema({c: { type: ObjectId, ref: 'ModelB.c' }); var Model_A = mongoose.model('ModelA', A); var Model_B = mongoose.model('ModelB', B);
Option 2: C as a Model
(I only present this as an alternative - since your example seems redundant since you create 'C' as a separate Model as well as a subdocument)
Alternatively, it may make sense to have separate collections, you can create a mongoose model for each. Each will be a separate collection:
var Model_A = mongoose.model('ModelA', A); var Model_B = mongoose.model('ModelB', B); var Model_C = mongoose.model('ModelC', C);
In this case you may want to directly reference each model:
var C = new Schema({...}); var B = new Schema({c: { type: ObjectId, ref: 'ModelC' }}); var A = new Schema({c: { type: ObjectId, ref: 'ModelC' });
The Point
Yes its possible, but you need to pick if you want C as a model or subdocument.
It's been 7 years but I faced the same issue, I found the plugin mongoose-sub-references-populate to populate subdocuments.
const subReferencesPopulate = require('mongoose-sub-references-populate');var B = new Schema({c: [C]}); var A = new Schema({c_inA: { type: ObjectId, subRef: 'ModelB.c' }); A.plugin(subReferencesPopulate);var Model_A = mongoose.model('ModelA', A); var Model_B = mongoose.model('ModelB', B); Model_A.findById(_id,async (error, res)=>{ await res.subPopulate('c_inA'); console.log(res);})