Mongoose中的虚拟与方法

时间:2015-04-16 17:15:39

标签: node.js mongoose

我理解static方法是Class Methods,而methodsInstance Methods,而Virtuals也是Instance Methods,但它们是methods没有存储在数据库中。

但是,我想知道这是virtuals和{{1}}之间的唯一区别。还有其他我缺少的东西吗?

2 个答案:

答案 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()

虚拟-用于读取模型的属性,并在代码级明确表明这些属性是属性/属性,而不是方法。此外,对于基于实例中已加载的数据的组合属性。例如胰蛋白酶全名示例。