Node.js 猫鼬:有没有一种方法可以将默认的lean设置为true(始终打开)?

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

我有一个只读的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.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或未定义时,此选项才会失效。