From bfed8a6193a2b3230b9bce2d38f5f1993116503c 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 | 40 +++++++++++++++++++ 2 files changed, 43 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..de71b9e324a 100644 --- a/test/helpers/indexes.getRelatedIndexes.test.js +++ b/test/helpers/indexes.getRelatedIndexes.test.js @@ -92,6 +92,46 @@ 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(