I have a read-only API that I'd like Mongoose to always have lean queries for.
Can I enable this either on a schema or connection level to be true by default?
I have a read-only API that I'd like Mongoose to always have lean queries for.
Can I enable this either on a schema or connection level to be true by default?
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.
if (this.mongooseOptions().lean == null) { this.mongooseOptions({ lean: true }); }Document, so the whole typing will be useless. Is there a way to declare that all query returns LeanDocument?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
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
}
Refer to the above comments:
mongoose.Query.prototype.setOptions = function(options, overwrite) {
options = Object.assign({}, options);
if (!options.hasOwnProperty('lean')) {
options.lean = true;
}
__setOptions.call(this, options, overwrite);
return this;
};
If you are worried about the accepted answer by @Leonid Beschastny, the places where you should not use lean, according to Mongoose docs are:
Source: https://mongoosejs.com/docs/tutorials/lean.html#when-to-use-lean
The easiest way to add the default lean option for a mongoose model. Just add these three lines.
For Example:
const mongoose = require('mongoose');
const BreakTimeTrackerSchema = new mongoose.Schema({
user_id: {
type: Number
},
company_id: {
type: Number
},
break_time: {
type: Number
}
}, {timestamps: true});
BreakTimeTrackerSchema.set('lean', true);
BreakTimeTrackerSchema.set('toObject', { virtuals: true });
BreakTimeTrackerSchema.set('toJSON', { virtuals: true });
module.exports = mongoose.model("break_time_tracker", BreakTimeTrackerSchema);