猫鼬:有没有办法将默认倾向于真(永远在线)?

时间:2013-10-04 14:33:22

标签: node.js mongoose

我有一个只读API,我希望Mongoose始终拥有lean queries

默认情况下,我可以在架构或连接级别启用此功能吗?

3 个答案:

答案 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方法(findfindOnefindByIdfindOneAndUpdate等。)

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
}