Skip to content

Commit 8e4361c

Browse files
authored
Merge branch 'master' into vkarpov15/gh-13874
2 parents 5d7ec67 + 3042ac1 commit 8e4361c

File tree

8 files changed

+99
-14
lines changed

8 files changed

+99
-14
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
7.6.1 / 2023-10-09
2+
==================
3+
* fix: bump bson to match mongodb@5.9.0 exactly #13947 [hasezoey](https://github.com/hasezoey)
4+
* fix: raw result deprecation message #13954 [simllll](https://github.com/simllll)
5+
* type: add types for includeResultMetadata #13955 [simllll](https://github.com/simllll)
6+
* perf(npmignore): ignore newer files #13946 [hasezoey](https://github.com/hasezoey)
7+
* perf: move mocha config from package.json to mocharc #13948 [hasezoey](https://github.com/hasezoey)
8+
19
7.6.0 / 2023-10-06
210
==================
311
* feat: upgrade mongodb node driver -> 5.9.0 #13927 #13926 [sanguineti](https://github.com/sanguineti)

lib/model.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3780,6 +3780,7 @@ Model.buildBulkWriteOperations = function buildBulkWriteOperations(documents, op
37803780
}
37813781

37823782
setDefaultOptions();
3783+
const discriminatorKey = this.schema.options.discriminatorKey;
37833784

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

38113812
_applyCustomWhere(document, where);
38123813

3814+
// Set the discriminator key, so bulk write casting knows which
3815+
// schema to use re: gh-13907
3816+
if (document[discriminatorKey] != null && !(discriminatorKey in where)) {
3817+
where[discriminatorKey] = document[discriminatorKey];
3818+
}
3819+
38133820
document.$__version(where, delta);
38143821
const writeOperation = { updateOne: { filter: where, update: changes } };
38153822
utils.injectTimestampsOption(writeOperation.updateOne, options.timestamps);

lib/schema.js

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -725,19 +725,6 @@ Schema.prototype.add = function add(obj, prefix) {
725725
for (const key in val[0].discriminators) {
726726
schemaType.discriminator(key, val[0].discriminators[key]);
727727
}
728-
} else if (val[0] != null && val[0].instanceOfSchema && val[0]._applyDiscriminators instanceof Map) {
729-
const applyDiscriminators = val[0]._applyDiscriminators;
730-
const schemaType = this.path(prefix + key);
731-
for (const disc of applyDiscriminators.keys()) {
732-
schemaType.discriminator(disc, applyDiscriminators.get(disc));
733-
}
734-
}
735-
else if (val != null && val.instanceOfSchema && val._applyDiscriminators instanceof Map) {
736-
const applyDiscriminators = val._applyDiscriminators;
737-
const schemaType = this.path(prefix + key);
738-
for (const disc of applyDiscriminators.keys()) {
739-
schemaType.discriminator(disc, applyDiscriminators.get(disc));
740-
}
741728
}
742729
} else if (Object.keys(val).length < 1) {
743730
// Special-case: {} always interpreted as Mixed path so leaf at this node

lib/schema/SubdocumentPath.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ function SubdocumentPath(schema, path, options) {
5555
this.$isSingleNested = true;
5656
this.base = schema.base;
5757
SchemaType.call(this, path, options, 'Embedded');
58+
59+
if (schema._applyDiscriminators != null) {
60+
for (const disc of schema._applyDiscriminators.keys()) {
61+
this.discriminator(disc, schema._applyDiscriminators.get(disc));
62+
}
63+
}
5864
}
5965

6066
/*!

lib/schema/documentarray.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ function DocumentArrayPath(key, schema, options, schemaOptions) {
8888

8989
this.$embeddedSchemaType.caster = this.Constructor;
9090
this.$embeddedSchemaType.schema = this.schema;
91+
92+
if (schema._applyDiscriminators != null) {
93+
for (const disc of schema._applyDiscriminators.keys()) {
94+
this.discriminator(disc, schema._applyDiscriminators.get(disc));
95+
}
96+
}
9197
}
9298

9399
/**

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "mongoose",
33
"description": "Mongoose MongoDB ODM",
4-
"version": "7.6.0",
4+
"version": "7.6.1",
55
"author": "Guillermo Rauch <guillermo@learnboost.com>",
66
"keywords": [
77
"mongodb",

test/document.test.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12550,6 +12550,56 @@ describe('document', function() {
1255012550

1255112551
assert.equal(Object.keys(TestModel.schema.subpaths).length, 3);
1255212552
});
12553+
12554+
it('handles embedded discriminators defined using Schema.prototype.discriminator (gh-13898)', async function() {
12555+
const baseNestedDiscriminated = new Schema({
12556+
type: { type: Number, required: true }
12557+
}, { discriminatorKey: 'type' });
12558+
12559+
class BaseClass {
12560+
whoAmI() {
12561+
return 'I am baseNestedDiscriminated';
12562+
}
12563+
}
12564+
BaseClass.type = 1;
12565+
12566+
baseNestedDiscriminated.loadClass(BaseClass);
12567+
12568+
class NumberTyped extends BaseClass {
12569+
whoAmI() {
12570+
return 'I am NumberTyped';
12571+
}
12572+
}
12573+
NumberTyped.type = 3;
12574+
12575+
class StringTyped extends BaseClass {
12576+
whoAmI() {
12577+
return 'I am StringTyped';
12578+
}
12579+
}
12580+
StringTyped.type = 4;
12581+
12582+
baseNestedDiscriminated.discriminator(1, new Schema({}).loadClass(NumberTyped));
12583+
baseNestedDiscriminated.discriminator('3', new Schema({}).loadClass(StringTyped));
12584+
12585+
const containsNestedSchema = new Schema({
12586+
nestedDiscriminatedTypes: { type: [baseNestedDiscriminated], required: true }
12587+
});
12588+
12589+
class ContainsNested {
12590+
whoAmI() {
12591+
return 'I am ContainsNested';
12592+
}
12593+
}
12594+
containsNestedSchema.loadClass(ContainsNested);
12595+
12596+
const Test = db.model('Test', containsNestedSchema);
12597+
const instance = await Test.create({ type: 1, nestedDiscriminatedTypes: [{ type: 1 }, { type: '3' }] });
12598+
assert.deepStrictEqual(
12599+
instance.nestedDiscriminatedTypes.map(i => i.whoAmI()),
12600+
['I am NumberTyped', 'I am StringTyped']
12601+
);
12602+
});
1255312603
});
1255412604

1255512605
describe('Check if instance function that is supplied in schema option is availabe', function() {

test/model.test.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6239,6 +6239,27 @@ describe('Model', function() {
62396239
assert.equal(writeOperations.length, 3);
62406240
});
62416241

6242+
it('saves changes in discriminators if calling `bulkSave()` on base model (gh-13907)', async() => {
6243+
const schema = new mongoose.Schema(
6244+
{ value: String },
6245+
{ discriminatorKey: 'type' }
6246+
);
6247+
const typeASchema = new mongoose.Schema({ aValue: String });
6248+
schema.discriminator('A', typeASchema);
6249+
6250+
const TestModel = db.model('Test', schema);
6251+
const testData = { value: 'initValue', type: 'A', aValue: 'initAValue' };
6252+
const doc = await TestModel.create(testData);
6253+
6254+
doc.value = 'updatedValue1';
6255+
doc.aValue = 'updatedValue2';
6256+
await TestModel.bulkSave([doc]);
6257+
6258+
const findDoc = await TestModel.findById(doc._id);
6259+
assert.strictEqual(findDoc.value, 'updatedValue1');
6260+
assert.strictEqual(findDoc.aValue, 'updatedValue2');
6261+
});
6262+
62426263
it('accepts `timestamps: false` (gh-12059)', async() => {
62436264
// Arrange
62446265
const userSchema = new Schema({

0 commit comments

Comments
 (0)