Mongoose: Is there a way to default lean to true (always on)?

I have to use My nestjs Application like this. Its perfectly working for me.

import { Query } from 'mongoose'

Query.prototype.setOptions = function(options: any) {
  __setOptions.apply(this, arguments)
  if (!this.mongooseOptions().lean) this.mongooseOptions().lean = true
  return this
}

A hack-around could be performed something like this:

Current way of executing the query:

Model.find().lean().exec(function (err, docs) {
    docs[0] instanceof mongoose.Document // false
});

Fiddle with the Model's find method:

var findOriginal = Model.prototype.find;
Model.prototype.find = function() {
    return findOriginal.apply(this, arguments).lean();
}

New way of executing the query:

Model.find().exec(function (err, docs) {
    docs[0] instanceof mongoose.Document // false
});

I have not tested this code, but if you have tried to override library functionality in JavaScript before, you will easily grasp where I'm getting


The easiest way is to monkey patch mongoose.Query class to add default lean option:

var __setOptions = mongoose.Query.prototype.setOptions;

mongoose.Query.prototype.setOptions = function(options, overwrite) {
  __setOptions.apply(this, arguments);
  if (this.options.lean == null) this.options.lean = true;
  return this;
};

Mongoose creates new instance of mongoose.Query for every query and setOptions call is a part of mongoose.Query construction.

By patching mongoose.Query class you'll be able to turn lean queries on globally. So you won't need to path all mongoose methods (find, findOne, findById, findOneAndUpdate, etc.).

Mongoose uses Query class for inner calls like populate. It passes original Query options to each sub-query, so there should be no problems, but be careful with this solution anyway.