Skip to content

Commit abb3563

Browse files
committed
fix(document): call subdocument getters if child schema has getters: true
Fix #12105
1 parent edcf468 commit abb3563

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

lib/document.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3642,10 +3642,10 @@ Document.prototype.$toObject = function(options, json) {
36423642
options.minimize = _minimize;
36433643

36443644
cloneOptions._parentOptions = options;
3645-
cloneOptions._skipSingleNestedGetters = true;
3645+
cloneOptions._skipSingleNestedGetters = false;
36463646

36473647
const gettersOptions = Object.assign({}, cloneOptions);
3648-
gettersOptions._skipSingleNestedGetters = false;
3648+
gettersOptions._skipSingleNestedGetters = true;
36493649

36503650
// remember the root transform function
36513651
// to save it from being overwritten by sub-transform functions

test/document.test.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5426,8 +5426,29 @@ describe('document', function() {
54265426

54275427
doc.toObject({ getters: false });
54285428
assert.equal(called, 1);
5429+
});
54295430

5430-
return Promise.resolve();
5431+
it('calls subdocument getters if child schema has getters: true (gh-12105)', function() {
5432+
let called = 0;
5433+
5434+
const childSchema = new Schema({
5435+
_id: false,
5436+
value: {
5437+
type: String,
5438+
get: function(v) {
5439+
++called;
5440+
return v.toUpperCase();
5441+
}
5442+
}
5443+
}, { toJSON: { getters: true } });
5444+
const schema = new Schema({ name: childSchema });
5445+
const Test = db.model('Test', schema);
5446+
5447+
const doc = new Test({ name: { value: 'John Smith' } });
5448+
5449+
const res = doc.toJSON();
5450+
assert.equal(called, 1);
5451+
assert.deepStrictEqual(res.name, { value: 'JOHN SMITH' });
54315452
});
54325453

54335454
it('setting doc array to array of top-level docs works (gh-5632)', function(done) {

0 commit comments

Comments
 (0)