11

我有一个只读 API,我希望 Mongoose 始终对其进行精益查询

我可以在架构或连接级别上启用它以默认为真吗?

4

4 回答 4

17

最简单的方法是猴子补丁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.QueryMongoose为每个查询创建新实例,setOptions调用是mongoose.Query构造的一部分。

通过修补mongoose.Query类,您将能够在全球范围内打开精益查询。因此,您不需要路径所有mongoose方法(findfindOnefindByIdfindOneAndUpdate等)。

Mongoose使用Query类进行内部调用,如填充。它将原始Query选项传递给每个子查询,因此应该没有问题,但无论如何都要小心这个解决方案。

于 2013-10-04T16:25:28.143 回答
2

可以像这样执行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 中覆盖库功能,你会很容易掌握我在哪里

于 2013-10-04T14:44:28.267 回答
1

我必须像这样使用我的 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
}
于 2019-12-16T14:24:48.580 回答
0

参考以上评论:

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;
};

于 2021-10-14T01:19:56.587 回答