Skip to content

Commit

Permalink
Merge branch 'master' into vkarpov15/gh-13874
Browse files Browse the repository at this point in the history
  • Loading branch information
vkarpov15 committed Oct 10, 2023
2 parents 5d7ec67 + 3042ac1 commit 8e4361c
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 14 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
7.6.1 / 2023-10-09
==================
* fix: bump bson to match mongodb@5.9.0 exactly #13947 [hasezoey](https://github.com/hasezoey)
* fix: raw result deprecation message #13954 [simllll](https://github.com/simllll)
* type: add types for includeResultMetadata #13955 [simllll](https://github.com/simllll)
* perf(npmignore): ignore newer files #13946 [hasezoey](https://github.com/hasezoey)
* perf: move mocha config from package.json to mocharc #13948 [hasezoey](https://github.com/hasezoey)

7.6.0 / 2023-10-06
==================
* feat: upgrade mongodb node driver -> 5.9.0 #13927 #13926 [sanguineti](https://github.com/sanguineti)
Expand Down
7 changes: 7 additions & 0 deletions lib/model.js
Original file line number Diff line number Diff line change
Expand Up @@ -3780,6 +3780,7 @@ Model.buildBulkWriteOperations = function buildBulkWriteOperations(documents, op
}

setDefaultOptions();
const discriminatorKey = this.schema.options.discriminatorKey;

const writeOperations = documents.reduce((accumulator, document, i) => {
if (!options.skipValidation) {
Expand Down Expand Up @@ -3810,6 +3811,12 @@ Model.buildBulkWriteOperations = function buildBulkWriteOperations(documents, op

_applyCustomWhere(document, where);

// Set the discriminator key, so bulk write casting knows which
// schema to use re: gh-13907
if (document[discriminatorKey] != null && !(discriminatorKey in where)) {
where[discriminatorKey] = document[discriminatorKey];
}

document.$__version(where, delta);
const writeOperation = { updateOne: { filter: where, update: changes } };
utils.injectTimestampsOption(writeOperation.updateOne, options.timestamps);
Expand Down
13 changes: 0 additions & 13 deletions lib/schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -725,19 +725,6 @@ Schema.prototype.add = function add(obj, prefix) {
for (const key in val[0].discriminators) {
schemaType.discriminator(key, val[0].discriminators[key]);
}
} else if (val[0] != null && val[0].instanceOfSchema && val[0]._applyDiscriminators instanceof Map) {
const applyDiscriminators = val[0]._applyDiscriminators;
const schemaType = this.path(prefix + key);
for (const disc of applyDiscriminators.keys()) {
schemaType.discriminator(disc, applyDiscriminators.get(disc));
}
}
else if (val != null && val.instanceOfSchema && val._applyDiscriminators instanceof Map) {
const applyDiscriminators = val._applyDiscriminators;
const schemaType = this.path(prefix + key);
for (const disc of applyDiscriminators.keys()) {
schemaType.discriminator(disc, applyDiscriminators.get(disc));
}
}
} else if (Object.keys(val).length < 1) {
// Special-case: {} always interpreted as Mixed path so leaf at this node
Expand Down
6 changes: 6 additions & 0 deletions lib/schema/SubdocumentPath.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,12 @@ function SubdocumentPath(schema, path, options) {
this.$isSingleNested = true;
this.base = schema.base;
SchemaType.call(this, path, options, 'Embedded');

if (schema._applyDiscriminators != null) {
for (const disc of schema._applyDiscriminators.keys()) {
this.discriminator(disc, schema._applyDiscriminators.get(disc));
}
}
}

/*!
Expand Down
6 changes: 6 additions & 0 deletions lib/schema/documentarray.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@ function DocumentArrayPath(key, schema, options, schemaOptions) {

this.$embeddedSchemaType.caster = this.Constructor;
this.$embeddedSchemaType.schema = this.schema;

if (schema._applyDiscriminators != null) {
for (const disc of schema._applyDiscriminators.keys()) {
this.discriminator(disc, schema._applyDiscriminators.get(disc));
}
}
}

/**
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "mongoose",
"description": "Mongoose MongoDB ODM",
"version": "7.6.0",
"version": "7.6.1",
"author": "Guillermo Rauch <guillermo@learnboost.com>",
"keywords": [
"mongodb",
Expand Down
50 changes: 50 additions & 0 deletions test/document.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -12550,6 +12550,56 @@ describe('document', function() {

assert.equal(Object.keys(TestModel.schema.subpaths).length, 3);
});

Check failure on line 12553 in test/document.test.js

View workflow job for this annotation

GitHub Actions / Lint JS-Files

Trailing spaces not allowed

Check failure on line 12553 in test/document.test.js

View workflow job for this annotation

GitHub Actions / Lint JS-Files

Trailing spaces not allowed
it('handles embedded discriminators defined using Schema.prototype.discriminator (gh-13898)', async function() {
const baseNestedDiscriminated = new Schema({
type: { type: Number, required: true }
}, { discriminatorKey: 'type' });

class BaseClass {
whoAmI() {
return 'I am baseNestedDiscriminated';
}
}
BaseClass.type = 1;

baseNestedDiscriminated.loadClass(BaseClass);

class NumberTyped extends BaseClass {
whoAmI() {
return 'I am NumberTyped';
}
}
NumberTyped.type = 3;

class StringTyped extends BaseClass {
whoAmI() {
return 'I am StringTyped';
}
}
StringTyped.type = 4;

baseNestedDiscriminated.discriminator(1, new Schema({}).loadClass(NumberTyped));
baseNestedDiscriminated.discriminator('3', new Schema({}).loadClass(StringTyped));

const containsNestedSchema = new Schema({
nestedDiscriminatedTypes: { type: [baseNestedDiscriminated], required: true }
});

class ContainsNested {
whoAmI() {
return 'I am ContainsNested';
}
}
containsNestedSchema.loadClass(ContainsNested);

const Test = db.model('Test', containsNestedSchema);
const instance = await Test.create({ type: 1, nestedDiscriminatedTypes: [{ type: 1 }, { type: '3' }] });
assert.deepStrictEqual(
instance.nestedDiscriminatedTypes.map(i => i.whoAmI()),
['I am NumberTyped', 'I am StringTyped']
);
});
});

describe('Check if instance function that is supplied in schema option is availabe', function() {
Expand Down
21 changes: 21 additions & 0 deletions test/model.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6239,6 +6239,27 @@ describe('Model', function() {
assert.equal(writeOperations.length, 3);
});

it('saves changes in discriminators if calling `bulkSave()` on base model (gh-13907)', async() => {
const schema = new mongoose.Schema(
{ value: String },
{ discriminatorKey: 'type' }
);
const typeASchema = new mongoose.Schema({ aValue: String });
schema.discriminator('A', typeASchema);

const TestModel = db.model('Test', schema);
const testData = { value: 'initValue', type: 'A', aValue: 'initAValue' };
const doc = await TestModel.create(testData);

doc.value = 'updatedValue1';
doc.aValue = 'updatedValue2';
await TestModel.bulkSave([doc]);

const findDoc = await TestModel.findById(doc._id);
assert.strictEqual(findDoc.value, 'updatedValue1');
assert.strictEqual(findDoc.aValue, 'updatedValue2');
});

it('accepts `timestamps: false` (gh-12059)', async() => {
// Arrange
const userSchema = new Schema({
Expand Down

0 comments on commit 8e4361c

Please sign in to comment.