diff --git a/lib/helpers/query/castUpdate.js b/lib/helpers/query/castUpdate.js index 37a53b5a7e6..231da434e17 100644 --- a/lib/helpers/query/castUpdate.js +++ b/lib/helpers/query/castUpdate.js @@ -249,7 +249,8 @@ function walkUpdatePath(schema, obj, op, options, context, filter, pref) { let pathDetails = schema._getPathType(checkPath); - // If no schema type, check for embedded discriminators + // If no schema type, check for embedded discriminators because the + // filter or update may imply an embedded discriminator type. See #8378 if (schematype == null) { const _res = getEmbeddedDiscriminatorPath(schema, obj, filter, checkPath); if (_res.schematype != null) { diff --git a/lib/helpers/query/getEmbeddedDiscriminatorPath.js b/lib/helpers/query/getEmbeddedDiscriminatorPath.js index 8214158377b..ff297ace6ff 100644 --- a/lib/helpers/query/getEmbeddedDiscriminatorPath.js +++ b/lib/helpers/query/getEmbeddedDiscriminatorPath.js @@ -45,6 +45,10 @@ module.exports = function getEmbeddedDiscriminatorPath(schema, update, filter, p discriminatorKey = filter[wrapperPath].$elemMatch[key]; } + if (discriminatorValuePath in update) { + discriminatorKey = update[discriminatorValuePath]; + } + if (discriminatorKey == null || discriminators[discriminatorKey] == null) { continue; }