From 523c18142b2767ef83a8f6739d21e44fbfeca9f0 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Sat, 5 Oct 2019 11:05:47 -0700 Subject: [PATCH] fix(update): support updating array embedded discriminator props if discriminator key in $elemMatch Fix #8063 --- lib/helpers/query/getEmbeddedDiscriminatorPath.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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; }