diff --git a/lib/query.js b/lib/query.js index 1bfed85a27e..634616fe79a 100644 --- a/lib/query.js +++ b/lib/query.js @@ -4019,7 +4019,9 @@ Query.prototype._findAndModify = function(type, callback) { */ function _completeOneLean(schema, doc, path, res, opts, callback) { - if (opts.lean && opts.lean.transform) { + if (opts.lean && typeof opts.lean.transform === 'function') { + opts.lean.transform(doc); + for (let i = 0; i < schema.childSchemas.length; i++) { const childPath = path ? path + '.' + schema.childSchemas[i].model.path : schema.childSchemas[i].model.path; const _schema = schema.childSchemas[i].schema; @@ -4053,7 +4055,11 @@ function _completeOneLean(schema, doc, path, res, opts, callback) { */ function _completeManyLean(schema, docs, path, opts, callback) { - if (opts.lean && opts.lean.transform) { + if (opts.lean && typeof opts.lean.transform === 'function') { + for (const doc of docs) { + opts.lean.transform(doc); + } + for (let i = 0; i < schema.childSchemas.length; i++) { const childPath = path ? path + '.' + schema.childSchemas[i].model.path : schema.childSchemas[i].model.path; const _schema = schema.childSchemas[i].schema; diff --git a/test/query.test.js b/test/query.test.js index 746774c5c42..1ebc5320aa4 100644 --- a/test/query.test.js +++ b/test/query.test.js @@ -4006,22 +4006,28 @@ describe('Query', function() { }); const Test = db.model('gh10423', testSchema); await Test.create({ name: 'foo', foo: [{ sub: 'Test' }, { sub: 'Testerson' }], otherName: { nickName: 'Bar' } }); - const result = await Test.find().lean({ transform: (doc) => { - delete doc._id; - return doc; - } }); - assert(result[0]._id); - assert.equal(result[0].otherName._id, undefined); - assert.equal(result[0].foo[0]._id, undefined); - assert.equal(result[0].foo[1]._id, undefined); - const single = await Test.findOne().lean({ transform: (doc) => { - delete doc._id; - return doc; - } }); - assert(single._id); - assert.equal(single.otherName._id, undefined); - assert.equal(single.foo[0]._id, undefined); - assert.equal(single.foo[0]._id, undefined); + + const result = await Test.find().lean({ + transform: (doc) => { + delete doc._id; + return doc; + } + }); + assert.strictEqual(result[0]._id, undefined); + assert.strictEqual(result[0].otherName._id, undefined); + assert.strictEqual(result[0].foo[0]._id, undefined); + assert.strictEqual(result[0].foo[1]._id, undefined); + + const single = await Test.findOne().lean({ + transform: (doc) => { + delete doc._id; + return doc; + } + }); + assert.strictEqual(single._id, undefined); + assert.strictEqual(single.otherName._id, undefined); + assert.strictEqual(single.foo[0]._id, undefined); + assert.strictEqual(single.foo[0]._id, undefined); }); it('skips applying default projections over slice projections (gh-11940)', async function() {