Skip to content

Commit 3a015f9

Browse files
authored
Merge pull request #14202 from Automattic/vkarpov15/gh-14162
fix(discriminator): handle reusing schema with embedded discriminators defined using Schema.prototype.discriminator
2 parents 94de74f + 50b0078 commit 3a015f9

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

lib/helpers/discriminator/applyEmbeddedDiscriminators.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,15 @@ function applyEmbeddedDiscriminators(schema, seen = new WeakSet()) {
1616
if (!schemaType.schema._applyDiscriminators) {
1717
continue;
1818
}
19+
if (schemaType._appliedDiscriminators) {
20+
continue;
21+
}
1922
for (const disc of schemaType.schema._applyDiscriminators.keys()) {
20-
schemaType.discriminator(disc, schemaType.schema._applyDiscriminators.get(disc));
23+
schemaType.discriminator(
24+
disc,
25+
schemaType.schema._applyDiscriminators.get(disc)
26+
);
2127
}
28+
schemaType._appliedDiscriminators = true;
2229
}
2330
}

test/document.test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12765,6 +12765,28 @@ describe('document', function() {
1276512765
);
1276612766
});
1276712767

12768+
it('handles reusing schema with embedded discriminators defined using Schema.prototype.discriminator (gh-14162)', async function() {
12769+
const discriminated = new Schema({
12770+
type: { type: Number, required: true }
12771+
}, { discriminatorKey: 'type' });
12772+
12773+
discriminated.discriminator(1, new Schema({ prop1: String }));
12774+
discriminated.discriminator(3, new Schema({ prop2: String }));
12775+
12776+
const containerSchema = new Schema({ items: [discriminated] });
12777+
const containerModel = db.model('Test', containerSchema);
12778+
const containerModel2 = db.model('Test1', containerSchema);
12779+
const doc1 = new containerModel({ items: [{ type: 1, prop1: 'foo' }, { type: 3, prop2: 'bar' }] });
12780+
const doc2 = new containerModel2({ items: [{ type: 1, prop1: 'baz' }, { type: 3, prop2: 'qux' }] });
12781+
await doc1.save();
12782+
await doc2.save();
12783+
12784+
doc1.items.push({ type: 3, prop2: 'test1' });
12785+
doc2.items.push({ type: 3, prop2: 'test1' });
12786+
await doc1.save();
12787+
await doc2.save();
12788+
});
12789+
1276812790
it('can use `collection` as schema name (gh-13956)', async function() {
1276912791
const schema = new mongoose.Schema({ name: String, collection: String });
1277012792
const Test = db.model('Test', schema);

0 commit comments

Comments
 (0)