Skip to content

Commit

Permalink
fix(document): avoid unnecessary clone() in applyGetters() that was…
Browse files Browse the repository at this point in the history
… triggering additional getters

Fix #14840
Fix #14835
Re: #14724
  • Loading branch information
vkarpov15 committed Aug 29, 2024
1 parent 69dacc2 commit f87c811
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 12 deletions.
14 changes: 7 additions & 7 deletions lib/document.js
Original file line number Diff line number Diff line change
Expand Up @@ -3856,7 +3856,6 @@ Document.prototype.$toObject = function(options, json) {
// Parent options should only bubble down for subdocuments, not populated docs
options._parentOptions = this.$isSubdocument ? options : null;

options._skipSingleNestedGetters = false;
// remember the root transform function
// to save it from being overwritten by sub-transform functions
// const originalTransform = options.transform;
Expand All @@ -3870,13 +3869,13 @@ Document.prototype.$toObject = function(options, json) {
ret = clone(this._doc, options) || {};
}

options._skipSingleNestedGetters = true;
const getters = options._calledWithOptions.getters
?? options.getters
?? defaultOptions.getters
?? false;

if (getters) {
applyGetters(this, ret, options);
applyGetters(this, ret);

if (options.minimize) {
ret = minimize(ret) || {};
Expand Down Expand Up @@ -4187,12 +4186,11 @@ function applyVirtuals(self, json, options, toObjectOptions) {
*
* @param {Document} self
* @param {Object} json
* @param {Object} [options]
* @return {Object} `json`
* @api private
*/

function applyGetters(self, json, options) {
function applyGetters(self, json) {
const schema = self.$__schema;
const paths = Object.keys(schema.paths);
let i = paths.length;
Expand Down Expand Up @@ -4228,8 +4226,10 @@ function applyGetters(self, json, options) {
if (branch != null && typeof branch !== 'object') {
break;
} else if (ii === last) {
const val = self.$get(path);
branch[part] = clone(val, options);
branch[part] = schema.paths[path].applyGetters(
branch[part],
self
);
if (Array.isArray(branch[part]) && schema.paths[path].$embeddedSchemaType) {
for (let i = 0; i < branch[part].length; ++i) {
branch[part][i] = schema.paths[path].$embeddedSchemaType.applyGetters(
Expand Down
5 changes: 0 additions & 5 deletions lib/helpers/clone.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,6 @@ function clone(obj, options, isArrayChild) {

if (isMongooseObject(obj)) {
if (options) {
// Single nested subdocs should apply getters later in `applyGetters()`
// when calling `toObject()`. See gh-7442, gh-8295
if (options._skipSingleNestedGetters && obj.$isSingleNested) {
options._calledWithOptions = Object.assign({}, options._calledWithOptions || {}, { getters: false });
}
if (options.retainDocuments && obj.$__ != null) {
const clonedDoc = obj.$clone();
if (obj.__index != null) {
Expand Down

0 comments on commit f87c811

Please sign in to comment.