mongoose - ObjectId that references a Sub-Document mongoose - ObjectId that references a Sub-Document mongoose mongoose

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