Node.js 猫鼬中的虚拟与方法

Node.js 猫鼬中的虚拟与方法,node.js,mongoose,Node.js,Mongoose,我了解到静态方法是类方法,方法是实例方法,虚拟也类似于实例方法,但它们不存储在数据库中 然而,我想知道这是否是方法和虚拟之间的唯一区别。还有什么我遗漏的吗?数据库中没有存储实例方法、静态方法或虚拟方法。方法和虚拟对象之间的区别在于,虚拟对象的访问方式类似于属性,方法的调用方式类似于函数。instance/static与virtuals之间没有区别,因为在类上可以访问虚拟静态属性是没有意义的,但是在类上有一些静态实用程序或工厂方法是有意义的 var PersonSchema = new Schem

我了解到
静态
方法是
类方法
方法
实例方法
虚拟
也类似于
实例方法
,但它们不存储在数据库中


然而,我想知道这是否是
方法
虚拟
之间的唯一区别。还有什么我遗漏的吗?

数据库中没有存储实例方法、静态方法或虚拟方法。方法和虚拟对象之间的区别在于,虚拟对象的访问方式类似于属性,方法的调用方式类似于函数。instance/static与virtuals之间没有区别,因为在类上可以访问虚拟静态属性是没有意义的,但是在类上有一些静态实用程序或工厂方法是有意义的

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

展示的示例,我试图弄清楚何时使用虚拟和何时使用实例,我将其总结如下:

静态-用于不需要运行模型实例的方法(操作)。或者,针对模型的通用操作

e、 g.查找文件,列出所有文件

实例-用于确实需要模型实例存在的方法(操作)

e、 g.根据当前实例数据查找或检索数据。与其他与实例关联的文档类似。model.getRelatedDocs()


Virtuals-用于读取模型的属性,并在代码级别明确这些是属性/属性,而不是方法。此外,对于基于实例中已加载的数据的组合属性。e、 g.全名示例

你是说
instance.getRelatedDocs()
而不是
model.getRelatedDocs()