2013-10-04 37 views
7

我有一个只读的API,我希望Mongoose始终有lean queriesMongoose:有没有一种方法可以将默认偏向真(始终开启)?

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

+0

似乎你可以将它应用于模式级别(http://mongoosejs.com/docs/guide.html#options),所以我怀疑你可以在连接级别上执行它:/ – tomahaug

+1

你可能会考虑直接使用mongodb本地驱动程序 - 它总是*精益*。 – WiredPrairie

+0

@WiredPrairie - 需要猫鼬在这个项目上的其他原因,但谢谢。 – k00k

回答

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.Query新实例,并setOptions呼叫mongoose.Query建设的一部分。

通过修补mongoose.Query类,您可以在全局范围内变为精益查询。因此,您无需路径全部mongoose方法(find,findOne,findById,findOneAndUpdate等)。

Mongoose使用Query类内部调用类似填充。它通过原来的Query选项到每个子查询,所以应该是没有问题,但要小心这个解决方案。

+0

比我的更好的答案,对你的赞赏! – tomahaug

+0

这不适用于节点6.7.0和猫鼬4.5.8。任何想法为什么? –

+2

在猫鼬4.5.8我不得不将“this.options.lean”改为“this.mongooseOptions.lean”。 –

2

黑客攻击,各地可以进行这样的事:

​​

拨弄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库覆盖功能,你会很容易掌握在那里我得到

+0

除非你想深入了解Mongoose的源代码,否则你当然必须为每个Model定义执行这个破解:) – tomahaug

相关问题