我有一个只读的API,我想Mongoose总是有精益查询。我可以在模式或连接级别上启用这一点,使其默认为true吗?
tmb3ates1#
最简单的方法是对mongoose.Query类进行monkey补丁,以添加默认精益选项:
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方法(find,findOne,findById,findOneAndUpdate等)设置路径。Mongoose使用Query类进行内部调用,例如populate。它将原始的Query选项传递给每个子查询,因此 * 应该 * 没有问题,但无论如何要小心使用此解决方案。
setOptions
mongoose
find
findOne
findById
findOneAndUpdate
Mongoose
Query
vmdwslir2#
可以执行如下所示的黑客攻击:当前执行查询的方式:
Model.find().lean().exec(function (err, docs) { docs[0] instanceof mongoose.Document // false });
修改Model的find方法:
Model
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中覆盖库功能,您将很容易理解我的理解
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 }
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; };
mhd8tkvw5#
如果你担心@Leonid Beschastny给出的答案,那么根据Mongoose的文档,你不应该使用lean的地方是:
图片来源:https://mongoosejs.com/docs/tutorials/lean.html#when-to-use-lean
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);
6条答案
按热度按时间tmb3ates1#
最简单的方法是对
mongoose.Query
类进行monkey补丁,以添加默认精益选项:Mongoose为每个查询创建
mongoose.Query
的新示例,setOptions
调用是mongoose.Query
构造的一部分。通过对
mongoose.Query
类进行补丁,你就可以在全局范围内打开精益查询,这样你就不需要为所有的mongoose
方法(find
,findOne
,findById
,findOneAndUpdate
等)设置路径。Mongoose
使用Query
类进行内部调用,例如populate。它将原始的Query
选项传递给每个子查询,因此 * 应该 * 没有问题,但无论如何要小心使用此解决方案。vmdwslir2#
可以执行如下所示的黑客攻击:
当前执行查询的方式:
修改
Model
的find
方法:执行查询的新方式:
我没有测试这段代码,但是如果您以前尝试过在JavaScript中覆盖库功能,您将很容易理解我的理解
gywdnpxw3#
我必须像这样使用我的nestjs应用程序。它非常适合我。
eaf3rand4#
参考上述评论:
mhd8tkvw5#
如果你担心@Leonid Beschastny给出的答案,那么根据Mongoose的文档,你不应该使用lean的地方是:
图片来源:https://mongoosejs.com/docs/tutorials/lean.html#when-to-use-lean
zte4gxcn6#
为 Mongoose 模型添加默认倾斜选项的最简单方法。只需添加这三行。
例如: