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.