2012-11-20 13 views
3

我开始在真实世界的应用程序中使用Mongoose中的虚拟获取器方法,并且想知道是否会对使用它们的性能产生影响,这对于预先了解会很有帮助。在使用Node.js的Mongoose中使用虚拟获取器会对性能产生影响吗?

例如:

var User = new Schema({ 
    name: { 
    first: String, 
    last: String 
    } 
}); 

User.virtual('name.full').get(function() { 
    return this.name.first + ' ' + this.name.last; 
}); 

基本上,我还不了解的吸气剂是如何生成的成猫鼬使用对象,和的值是否被填充上对象初始化或按需。

__defineGetter__可用于将属性映射到JavaScript中的方法,但似乎并未被Mongoose用于虚拟获取器(基于快速搜索代码)。

另一种方法是在初始化时填充每个虚拟路径,这意味着对于上例中的100个用户,加入姓氏和名字的方法被称为100次。

(我使用一个简化的例子中,吸气剂可以是复杂得多)

(例如,使用console.dir)是有点误导,因为内部方法用于由猫鼬处理翻译对象检查原始对象本身到'普通'对象或JSON,默认情况下不包含getter。

如果有人能说清楚这是如何工作的,以及大量吸气剂是否会成为问题,我会很感激。

回答

1

他们使用的是标准的方式可能做到:

Object.defineProperty(someInstance, propertyName, {get: yourGetter}); 

...意为 “不初始化”。我想,在初始化时读取虚拟属性将会破坏虚拟属性。

+0

对Mongoose代码的另一个搜索没有找到defineProperty的结果,因此它们显然不使用该方法。 re:击败这一点,虚拟属性并没有被持久化到数据库中,所以它不是完全相同的目的 - 它们可以返回基于数据库无法运行的逻辑的值(例如,上次修改的友好的“时间前”版本日期) –

+0

@JedWatson:我意识到这一点 - 它是否打败虚拟属性,假装它们是对象上的“真实”属性? (另外,如果你没有找到'Object.defineProperties',或者失败了,'Proxy'是一个选项,如果一些'Proxy' Node.js库是Mongoose的前提条件。) – Ryan

+0

对,他们实际上使用defineProperty--因此看起来没有任何性能问题。大!谢谢您的帮助。 –

相关问题