私はデータ アクセス レイヤーに mongoose を使用しています。ドキュメント モデル (属性、メソッド、静的メソッドなど) を作成するために提供されるさまざまな機能が非常に気に入っています。
Mongoose の仮想属性機能を使用して、MongoDB に永続化されない属性を作成します。ただし、これらの属性は計算コストが高くなります(そして、それらを何度も使用しても役に立ちません)。たとえば、マングース仮想
で
同じ例を見てみましょう。
それは持続し、仮想属性を使用します person.name.first
person.name.last
person.name.full
ドキュメントの存続期間中に person.name.full を 1 回だけ計算したいとします
(また、例のように属性またはその依存フィールドを設定できる場合は、ダーティ セットの後のすべての get に対しても)。
ドキュメントスコープに追加の変数が必要なので、当然これにクロージャーを使用しましたが、属性を計算する関数の「this」スコープは、作業中のドキュメントではなく、グローバルオブジェクトのものです。
コード:
var makeLazyAttribute = function(computeAttribute) {
var attribute = null;
return function() {
if(!attribute) {
attribute = computeAttribute();
}
return attribute;
}
};
MySchema.virtual('myAttribute').get(makeLazyAttribute(function () {
// some code that uses this, this should be the document I'm working on
// error: first is not defined, inspecting what is this gives me the global object
return this.first + this.last
}));
助けてください!