Node.js 猫鼬:有没有一种方法可以将默认的lean设置为true(始终打开)?
我有一个只读的API,我希望Mongoose永远拥有它Node.js 猫鼬:有没有一种方法可以将默认的lean设置为true(始终打开)?,node.js,mongoose,Node.js,Mongoose,我有一个只读的API,我希望Mongoose永远拥有它 我可以在模式或连接级别上默认启用此选项吗?可以执行如下操作: 当前执行查询的方式: Model.find().lean().exec(function (err, docs) { docs[0] instanceof mongoose.Document // false }); Model.find().exec(function (err, docs) { docs[0] instanceof mongoose.Docu
我可以在模式或连接级别上默认启用此选项吗?可以执行如下操作: 当前执行查询的方式:
Model.find().lean().exec(function (err, docs) {
docs[0] instanceof mongoose.Document // false
});
Model.find().exec(function (err, docs) {
docs[0] instanceof mongoose.Document // false
});
摆弄模型
的查找
方法:
var findOriginal = Model.prototype.find;
Model.prototype.find = function() {
return findOriginal.apply(this, arguments).lean();
}
执行查询的新方法:
Model.find().lean().exec(function (err, docs) {
docs[0] instanceof mongoose.Document // false
});
Model.find().exec(function (err, docs) {
docs[0] instanceof mongoose.Document // false
});
我没有测试过这段代码,但是如果您以前尝试过用JavaScript覆盖库功能,您将很容易掌握我得到的结果。最简单的方法是使用monkey patch
mongoose。查询
类以添加默认精简选项:
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
class,您将能够在全局范围内启用精益查询。因此,您不需要对所有mongoose
方法(find
,findOne
,findById
,findOneAndUpdate
等)进行路径设置
Mongoose
使用Query
类进行内部调用,如populate。它将原始的Query
选项传递给每个子查询,因此应该没有问题,但无论如何要小心使用此解决方案。我必须像这样使用我的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
}
似乎你不能在模式层()上应用它,所以我怀疑你可以在连接级别上做这件事:/你可以直接考虑只使用MangGDB本地驱动程序——它总是精益的。@ WiReRealie-在这个项目上需要MangoSE的其他原因,但是谢谢。你可以在同一个项目中使用它们。当然,你必须对每一个模型定义都进行这种破解,除非你想深入研究猫鼬的源代码:)比我的答案好得多,恭喜你!这不适用于节点6.7.0和mongoose 4.5.8。知道为什么吗?在Mongoose4.5.8中,我不得不将“this.options.lean”改为“this.mongooseOptions.lean”。使用Mongoose5.4.9,它的工作原理是:
if(this.mongooseOptions().lean==null){this.mongooseOptions({lean:true};}
我想指出这个代码示例存在一个关键问题。如果用户显式地将lean选项设置为false,则会将其设置为true。这就是为什么执行以下操作很重要:if(!This.mongooseOptions().lean==null),因为只有在提供的lean选项为null或未定义时,此选项才会失效。