我有一个只读API,希望Mongoose始终使用轻量级查询。
我可以在模式或连接级别上启用此功能,使其默认为true吗?
我有一个只读API,希望Mongoose始终使用轻量级查询。
我可以在模式或连接级别上启用此功能,使其默认为true吗?
最简单的方法是对 mongoose.Query
类进行猴子补丁(Monkey Patch),以添加默认的 lean 选项:
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为每个查询创建mongoose.Query
的新实例,setOptions
调用是mongoose.Query
构造的一部分。
通过修补mongoose.Query
类,您将能够全局启用轻量级查询。因此,您不需要修补全部mongoose
方法(例如find
、findOne
、findById
、findOneAndUpdate
等)。
Mongoose
在内部调用中使用Query
类,例如populate。它将原始Query
选项传递给每个子查询,因此理论上不应该出现问题,但无论如何都要小心这种解决方案。if (this.mongooseOptions().lean == null) { this.mongooseOptions({ lean: true }); }
。 - Leon以下是一种可能的解决方案:
当前执行查询的方式为:
Model.find().lean().exec(function (err, docs) {
docs[0] instanceof mongoose.Document // false
});
修改Model
的find
方法:
var findOriginal = Model.prototype.find;
Model.prototype.find = function() {
return findOriginal.apply(this, arguments).lean();
}
执行查询的新方法:
Model.find().exec(function (err, docs) {
docs[0] instanceof mongoose.Document // false
});
我没有测试过这段代码,但如果你之前尝试过在JavaScript中覆盖库功能,那么你很容易理解我的意思。
我必须像这样使用我的nestjs应用程序。它完美地为我工作。
import { Query } from 'mongoose'
Query.prototype.setOptions = function(options: any) {
__setOptions.apply(this, arguments)
if (!this.mongooseOptions().lean) this.mongooseOptions().lean = true
return this
}
来源:https://mongoosejs.com/docs/tutorials/lean.html#when-to-use-lean
请参考以上评论:
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;
};
为mongoose模型添加默认的lean选项最简单的方法是,只需添加以下三行代码。
例如:
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);