我有一个只读API,我希望Mongoose始终拥有lean queries。
默认情况下,我可以在架构或连接级别启用此功能吗?
答案 0 :(得分:13)
最简单的方法是使补丁mongoose.Query
类添加默认精益选项:
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
选项传递给每个子查询,因此应该没有问题,但无论如何都要小心这个解决方案。
答案 1 :(得分:2)
可以执行类似这样的黑客攻击:
执行查询的当前方式:
Model.find().lean().exec(function (err, docs) {
docs[0] instanceof mongoose.Document // false
});
使用Model
的{{1}}方法:
find
执行查询的新方法:
var findOriginal = Model.prototype.find;
Model.prototype.find = function() {
return findOriginal.apply(this, arguments).lean();
}
我有未经过测试此代码,但如果您之前尝试过覆盖JavaScript中的库功能,您将很容易掌握我的目标
答案 2 :(得分:0)
我必须这样使用My 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
}