我正在使用 mongoose 作为我的数据访问层,我真的很喜欢它提供的用于创建文档模型的不同功能(属性、方法、静态方法..)
我使用 mongoose 的虚拟属性特性来创建不会持久化到 MongoDB 的属性。但是,这些属性的计算成本很高(并且多次使用它们对我没有帮助)。让我们以mongoose virtual
上的相同示例为例,
它持续存在,并且使用 virtual 属性 person.name.first
person.name.last
person.name.full
假设我只想在文档的整个生命周期中计算 person.name.full 一次
(如果我允许像示例中那样设置属性或其依赖字段,那么对于脏集之后的每个 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
}));
请帮忙!