diff --git a/index.js b/index.js index f0342a0..eaf2abb 100644 --- a/index.js +++ b/index.js @@ -72,7 +72,14 @@ function getSchemaForDoc(schema, res) { } const discriminatorValue = res[schema.discriminatorMapping.key]; - const childSchema = schema.discriminators[discriminatorValue]; + let childSchema = undefined; + for (const name of Object.keys(schema.discriminators)) { + const matchValue = schema.discriminators[name].discriminatorMapping.value || modelName; + if (matchValue === discriminatorValue) { + childSchema = schema.discriminators[name]; + break; + } + } return childSchema; } diff --git a/test/index.test.js b/test/index.test.js index 4f57c3e..d163e46 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -249,6 +249,33 @@ describe('mongoose-lean-getters', function() { assert.equal(docs[0].url, 'https://www.test.com discriminator field'); }); + + it('should call getters on schemas with discriminator using explicit value', async function() { + const options = { discriminatorKey: 'kind' }; + + const eventSchema = new mongoose.Schema({ time: Date }, options); + eventSchema.plugin(mongooseLeanGetters); + const Event = mongoose.model('Event2', eventSchema); + + const ClickedLinkEvent = Event.discriminator('ClickedLink2', + new mongoose.Schema({ + url: { type: String, get: v => v + ' discriminator field' } + }, options), + { + value: 'ExplicitClickedLink' + } + ); + + await ClickedLinkEvent.deleteMany({}); + await ClickedLinkEvent.create({ + url: 'https://www.test.com' + }); + + // Should not throw "Cannot read properties of undefined (reading 'eachPath')" + const docs = await ClickedLinkEvent.find().lean({ getters: true }); + + assert.equal(docs[0].url, 'https://www.test.com discriminator field'); + }); it('should work on schemas with discriminators in arrays', async function() { const options = { discriminatorKey: 'kind' };