diff --git a/lib/schema.js b/lib/schema.js index ba8435e0e66..4a3f68e03ae 100644 --- a/lib/schema.js +++ b/lib/schema.js @@ -2409,8 +2409,15 @@ Schema.prototype._getSchema = function(path) { if (p + 1 >= parts.length) { return foundschema.$__schemaType; } - const ret = search(parts.slice(p + 1), foundschema.$__schemaType.schema); - return ret; + + if (foundschema.$__schemaType instanceof MongooseTypes.Mixed) { + return foundschema.$__schemaType; + } + if (foundschema.$__schemaType.schema != null) { + // Map of docs + const ret = search(parts.slice(p + 1), foundschema.$__schemaType.schema); + return ret; + } } foundschema.$fullPath = resultPath.join('.'); diff --git a/test/schema.test.js b/test/schema.test.js index 36368c58b2d..619df3dd7c9 100644 --- a/test/schema.test.js +++ b/test/schema.test.js @@ -2885,4 +2885,17 @@ describe('schema', function() { assert.equal(schema.path('num').instance, 'Decimal128'); assert.equal(schema.path('num2').instance, 'Decimal128'); }); + + it('_getSchema finds path underneath nested subdocument with map of mixed (gh-12530)', function() { + const schema = new Schema({ + child: new Schema({ + testMap: { + type: Map, + of: 'Mixed' + } + }) + }); + + assert.equal(schema._getSchema('child.testMap.foo.bar').instance, 'Mixed'); + }); });