Skip to content

Commit f8268c5

Browse files
committed
fix(document): ensure transform function passed to toObject() options applies to subdocs
Fix #14589 Re: #14565
1 parent 5e08e3e commit f8268c5

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

lib/document.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -3831,16 +3831,14 @@ Document.prototype.$toObject = function(options, json) {
38313831
// need the original options the user passed in, plus `_isNested` and
38323832
// `_parentOptions` for checking whether we need to depopulate.
38333833
const cloneOptions = {
3834+
...options,
38343835
_isNested: true,
38353836
json: json,
38363837
minimize: _minimize,
38373838
flattenMaps: flattenMaps,
38383839
flattenObjectIds: flattenObjectIds,
38393840
_seen: (options && options._seen) || new Map(),
3840-
_calledWithOptions: options._calledWithOptions,
3841-
virtuals: options.virtuals,
3842-
getters: options.getters,
3843-
depopulate: options.depopulate
3841+
_calledWithOptions: options._calledWithOptions
38443842
};
38453843

38463844
const depopulate = options.depopulate ||

test/document.test.js

+28
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,34 @@ describe('document', function() {
520520
docs.toObject({ transform: true });
521521
});
522522

523+
it('propagates toObject transform function to all subdocuments (gh-14589)', async function() {
524+
const schema = new mongoose.Schema({
525+
name: String,
526+
docArr: [{ name: String }],
527+
subdoc: new mongoose.Schema({ name: String })
528+
});
529+
const TestModel = db.model('Test', schema);
530+
531+
const doc = new TestModel({
532+
name: 'test',
533+
docArr: [{ name: 'test' }],
534+
subdoc: { name: 'test' }
535+
});
536+
537+
// pass the transform as an inline option. Deletes `_id` property
538+
// from both the top-level document and the subdocument.
539+
const obj = doc.toObject({ transform: deleteId });
540+
541+
assert.equal(obj._id, undefined);
542+
assert.equal(obj.subdoc._id, undefined);
543+
assert.equal(obj.docArr[0]._id, undefined);
544+
545+
function deleteId(doc, ret) {
546+
delete ret._id;
547+
return ret;
548+
}
549+
});
550+
523551
it('disabling aliases in toObject options (gh-7548)', function() {
524552
const schema = new mongoose.Schema({
525553
name: {

0 commit comments

Comments
 (0)