diff --git a/lib/helpers/query/getEmbeddedDiscriminatorPath.js b/lib/helpers/query/getEmbeddedDiscriminatorPath.js index 822f211bbd4..8214158377b 100644 --- a/lib/helpers/query/getEmbeddedDiscriminatorPath.js +++ b/lib/helpers/query/getEmbeddedDiscriminatorPath.js @@ -22,21 +22,29 @@ module.exports = function getEmbeddedDiscriminatorPath(schema, update, filter, p if (schematype == null) { continue; } + type = schema.pathType(subpath); if ((schematype.$isSingleNested || schematype.$isMongooseDocumentArrayElement) && schematype.schema.discriminators != null) { const discriminators = schematype.schema.discriminators; - const discriminatorValuePath = subpath + '.' + - get(schematype, 'schema.options.discriminatorKey'); + const key = get(schematype, 'schema.options.discriminatorKey'); + const discriminatorValuePath = subpath + '.' + key; const discriminatorFilterPath = discriminatorValuePath.replace(/\.\d+\./, '.'); let discriminatorKey = null; + if (discriminatorValuePath in filter) { discriminatorKey = filter[discriminatorValuePath]; } if (discriminatorFilterPath in filter) { discriminatorKey = filter[discriminatorFilterPath]; } + const wrapperPath = subpath.replace(/\.\d+$/, ''); + if (schematype.$isMongooseDocumentArrayElement && + get(filter[wrapperPath], '$elemMatch.' + key) != null) { + discriminatorKey = filter[wrapperPath].$elemMatch[key]; + } + if (discriminatorKey == null || discriminators[discriminatorKey] == null) { continue; }