Skip to content

Discriminator with virtuals not working with shema constructor options.virtuals #12246

@Hybrid-Force

Description

@Hybrid-Force

Prerequisites

  • I have written a descriptive issue title
  • I have searched existing issues to ensure the bug has not already been reported

Mongoose version

6.5.2

Node.js version

16.15.0

MongoDB server version

4.2.1

Description

Virtuals can be defined using options.virtuals in Schema constructor, or schema.virtual() method. If virtuals are defined using the schema.virtual() method, discriminator works fine. However, when defining virtuals using the options.virtuals approach, calling model.discriminator() throws error Error: Can't customize discriminator option virtuals (can only modify toJSON, toObject, _id, id).

Steps to Reproduce

const baseSchema = new mongoose.Schema({
    name: String,
}, {
    virtuals: {
        virtualA: {
            get: () => 'virtualA',
        }
    }
});
const discriminatorSchema = new mongoose.Schema({
    prop: String,
});
discriminatorSchema.virtual('virtualB').get(() => 'virtualB');
const BaseModel = mongoose.model('DiscriminatedModelBeta', baseSchema);
const DiscriminatorModel = BaseModel.discriminator('D', discriminatorSchema);
const doc = new BaseModel({
    __t: 'D',
});
doc.virtualA.should.equal('virtualA');
doc.virtualB.should.equal('virtualB');

The code above defines virtuals using schema.virtual() methos. It works as expected.

const baseSchema = new mongoose.Schema({
    name: String,
}, {
    virtuals: {
        virtualA: {
            get: () => 'virtualA',
        }
    }
});
const discriminatorSchema = new mongoose.Schema({
    prop: String,
}, {
    virtuals: {
        virtualB: {
            get: () => 'virtualB',
        }
    }
});
const BaseModel = mongoose.model('DiscriminatedModelAlpha', baseSchema);
const DiscriminatorModel = BaseModel.discriminator('D', discriminatorSchema);
const doc = new BaseModel({
    __t: 'D',
});
doc.virtualA.should.equal('virtualA');
doc.virtualB.should.equal('virtualB');

The code above defines virtuals using options.virtual option. It throws error when calling BaseModel.discriminator().

Error: Can't customize discriminator option virtuals (can only modify toJSON, toObject, _id, id)

Expected Behavior

Discriminator should handle virtuals defined using options.virtuals option in Schema constructor.

Metadata

Metadata

Assignees

No one assigned

    Labels

    confirmed-bugWe've confirmed this is a bug in Mongoose and will fix it.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions