2013-10-04 36 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

相關問題