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。
如果有人能说清楚这是如何工作的,以及大量吸气剂是否会成为问题,我会很感激。
对Mongoose代码的另一个搜索没有找到defineProperty的结果,因此它们显然不使用该方法。 re:击败这一点,虚拟属性并没有被持久化到数据库中,所以它不是完全相同的目的 - 它们可以返回基于数据库无法运行的逻辑的值(例如,上次修改的友好的“时间前”版本日期) –
@JedWatson:我意识到这一点 - 它是否打败虚拟属性,假装它们是对象上的“真实”属性? (另外,如果你没有找到'Object.defineProperties',或者失败了,'Proxy'是一个选项,如果一些'Proxy' Node.js库是Mongoose的前提条件。) – Ryan
对,他们实际上使用defineProperty--因此看起来没有任何性能问题。大!谢谢您的帮助。 –