diff --git a/lib/services/populate/getVirtual.js b/lib/services/populate/getVirtual.js index b636e5d975d..1159e5310a0 100644 --- a/lib/services/populate/getVirtual.js +++ b/lib/services/populate/getVirtual.js @@ -29,18 +29,27 @@ function getVirtual(schema, name) { if (schema.paths[cur] && schema.paths[cur].schema) { schema = schema.paths[cur].schema; + const rest = parts.slice(i + 1).join('.'); - if (i === parts.length - 2 && schema.discriminators) { - // Check for embedded discriminators, don't currently support populating - // nested virtuals underneath embedded discriminators because that will - // require substantial refactoring. + if (schema.virtuals[rest]) { + if (i === parts.length - 2) { + schema.virtuals[rest].$nestedSchemaPath = + [nestedSchemaPath, cur].filter(v => !!v).join('.'); + return schema.virtuals[rest]; + } + continue; + } + + if (i + 1 < parts.length && schema.discriminators) { for (let key of Object.keys(schema.discriminators)) { - const discriminatorSchema = schema.discriminators[key]; - let _cur = parts[i + 1]; - if (discriminatorSchema.virtuals[_cur]) { - discriminatorSchema.virtuals[_cur].$nestedSchemaPath = - (nestedSchemaPath.length > 0 ? nestedSchemaPath + '.' : '') + cur; - return discriminatorSchema.virtuals[_cur]; + const _virtual = getVirtual(schema.discriminators[key], rest); + if (_virtual != null) { + _virtual.$nestedSchemaPath = [ + nestedSchemaPath, + cur, + _virtual.$nestedSchemaPath + ].filter(v => !!v).join('.'); + return _virtual; } } }