我有一个只读 API,我希望 Mongoose 始终对其进行精益查询。
我可以在架构或连接级别上启用它以默认为真吗?
最简单的方法是猴子补丁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.Query
Mongoose为每个查询创建新实例,setOptions
调用是mongoose.Query
构造的一部分。
通过修补mongoose.Query
类,您将能够在全球范围内打开精益查询。因此,您不需要路径所有mongoose
方法(find
、findOne
、findById
、findOneAndUpdate
等)。
Mongoose
使用Query
类进行内部调用,如填充。它将原始Query
选项传递给每个子查询,因此应该没有问题,但无论如何都要小心这个解决方案。
可以像这样执行hack-around:
当前执行查询的方式:
Model.find().lean().exec(function (err, docs) {
docs[0] instanceof mongoose.Document // false
});
摆弄Model
'sfind
方法:
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
}
参考以上评论:
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;
};