我理解static
方法是Class Methods
,而methods
是Instance Methods
,而Virtuals
也是Instance Methods
,但它们是methods
没有存储在数据库中。
但是,我想知道这是virtuals
和{{1}}之间的唯一区别。还有其他我缺少的东西吗?
答案 0 :(得分:16)
实例方法,静态方法或虚拟都不存储在数据库中。方法和虚拟之间的区别在于虚拟对象的属性被访问,方法被称为函数。实例/静态与虚拟之间没有区别,因为在类上可以访问虚拟静态属性是没有意义的,但在类上有一些静态实用工具或工厂方法是有意义的。
var PersonSchema = new Schema({
name: {
first: String,
last: String
}
});
PersonSchema.virtual('name.full').get(function () {
return this.name.first + ' ' + this.name.last;
});
var Person = mongoose.model('Person', PersonSchema);
var person = new Person({
name: {
first: 'Alex',
last: 'Ford'
}
});
console.log(person.name.full);
// would print "Alex Ford" to the console
方法被称为普通函数。
PersonSchema.method('fullName', function () {
return this.name.first + ' ' + this.name.last;
});
var person = new Person({
name: {
first: 'Alex',
last: 'Ford'
}
});
console.log(person.fullName());
// notice this time you call fullName like a function
您还可以像常规属性一样“设置”虚拟属性。只需致电.get
和.set
即可为这两项操作设置功能。请注意,在.get
中,您返回一个值,而在.set
中,您接受一个值并使用它来设置文档的非虚拟属性。
PersonSchema
.virtual('name.full')
.get(function () {
return this.name.first + ' ' + this.name.last;
})
.set(function (fullName) {
var parts = fullName.split(' ');
this.name.first = parts[0];
this.name.last = parts[1];
});
var person = new Person({
name: {
first: 'Alex',
last: 'Ford'
}
});
console.log(person.name.first);
// would log out "Alex"
person.name.full = 'Billy Bob';
// would set person.name.first and person.name.last appropriately
console.log(person.name.first);
// would log out "Billy"
你可以在技术上使用方法来处理所有事情而不使用虚拟属性,但虚拟属性对于某些事情是优雅的,例如我在这里用person.name.full
显示的例子。
答案 1 :(得分:0)
我试图弄清楚何时使用虚拟机以及何时使用实例,我将这样总结一下:
统计信息-对于不需要运行模型实例的方法(操作)。或者,针对模型进行常规操作。
例如查找文档,列出所有文档。
实例-对于确实需要提供模型实例的方法(操作)。
例如根据当前实例数据查找或检索数据。像其他与实例关联的文档一样。 model.getRelatedDocs()
虚拟-用于读取模型的属性,并在代码级明确表明这些属性是属性/属性,而不是方法。此外,对于基于实例中已加载的数据的组合属性。例如胰蛋白酶全名示例。