From e0b9eed58461769e054fc8d5eac7bf34bdef73be Mon Sep 17 00:00:00 2001 From: Christopher Peplin Date: Tue, 12 Dec 2023 19:28:34 -0500 Subject: [PATCH] Allow defining index on base model that applies to all discriminators --- lib/helpers/indexes/getRelatedIndexes.js | 4 ++- .../helpers/indexes.getRelatedIndexes.test.js | 36 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/helpers/indexes/getRelatedIndexes.js b/lib/helpers/indexes/getRelatedIndexes.js index 42d5798c623..b323be84c16 100644 --- a/lib/helpers/indexes/getRelatedIndexes.js +++ b/lib/helpers/indexes/getRelatedIndexes.js @@ -46,7 +46,9 @@ function getRelatedIndexes({ return indexes.filter(index => { const partialFilterExpression = getPartialFilterExpression(index, indexesType); - return !partialFilterExpression || !partialFilterExpression[discriminatorKey]; + return !partialFilterExpression + || !partialFilterExpression[discriminatorKey] + || partialFilterExpression[discriminatorKey]['$exists']; }); } diff --git a/test/helpers/indexes.getRelatedIndexes.test.js b/test/helpers/indexes.getRelatedIndexes.test.js index 3eb597f883d..f6100888de2 100644 --- a/test/helpers/indexes.getRelatedIndexes.test.js +++ b/test/helpers/indexes.getRelatedIndexes.test.js @@ -92,6 +92,42 @@ describe('getRelatedIndexes', () => { ] ); }); + it('with base model that has discriminator, it includes discriminator indexes that only checks for existence', () => { + // Arrange + const eventSchema = new Schema( + { actorId: { type: Schema.Types.ObjectId } }, + { autoIndex: false } + ); + eventSchema.index({ actorId: 1 }, + { unique: true, + partialFilterExpression: { + __t: { $exists: true } + } + }); + + const Event = db.model('Event', eventSchema); + + const clickEventSchema = new Schema( + { + clickedAt: Date, + productCategory: String + }, + { autoIndex: false } + ); + Event.discriminator('ClickEvent', clickEventSchema); + + // Act + const filteredSchemaIndexes = getRelatedSchemaIndexes(Event, Event.schema.indexes()); + + // Assert + assert.deepStrictEqual( + filteredSchemaIndexes, + [ + [{ actorId: 1 }, + { background: true, unique: true, partialFilterExpression: { __t: {$exists: true} } }] + ] + ); + }); it('with discriminator model, it only gets discriminator indexes', () => { // Arrange const eventSchema = new Schema(