Mongoose:有没有办法默认lean为true(始终打开)?

ewm0tg9j  于 2023-03-12  发布在  Go
关注(0)|答案(6)|浏览(190)

我有一个只读的API,我想Mongoose总是有精益查询。
我可以在模式或连接级别上启用这一点,使其默认为true吗?

tmb3ates

tmb3ates1#

最简单的方法是对mongoose.Query类进行monkey补丁,以添加默认精益选项:

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选项传递给每个子查询,因此 * 应该 * 没有问题,但无论如何要小心使用此解决方案。

vmdwslir

vmdwslir2#

可以执行如下所示的黑客攻击:
当前执行查询的方式:

Model.find().lean().exec(function (err, docs) {
    docs[0] instanceof mongoose.Document // false
});

修改Modelfind方法:

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中覆盖库功能,您将很容易理解我的理解

gywdnpxw

gywdnpxw3#

我必须像这样使用我的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
}
eaf3rand

eaf3rand4#

参考上述评论:

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

mhd8tkvw5#

如果你担心@Leonid Beschastny给出的答案,那么根据Mongoose的文档,你不应该使用lean的地方是:

  • 修改查询结果时
  • 使用自定义getter或转换

图片来源:https://mongoosejs.com/docs/tutorials/lean.html#when-to-use-lean

zte4gxcn

zte4gxcn6#

为 Mongoose 模型添加默认倾斜选项的最简单方法。只需添加这三行。

例如:

const mongoose = require('mongoose');
const BreakTimeTrackerSchema = new mongoose.Schema({
    user_id: {
        type: Number
    },
    company_id: {
        type: Number
    },
    break_time: {
        type: Number
    }
}, {timestamps: true});

BreakTimeTrackerSchema.set('lean', true);
BreakTimeTrackerSchema.set('toObject', { virtuals: true });
BreakTimeTrackerSchema.set('toJSON', { virtuals: true });
module.exports = mongoose.model("break_time_tracker", BreakTimeTrackerSchema);

相关问题