mongoose 的Virtual是什么?

WEB松
  • 40

Virtual properties are document properties that you can get and set but that do not get persisted to MongoDB.

这句话看不是很懂。请不要翻译,希望能用自己的话解释,有例子更好。谢谢

回复
阅读 5.2k
1 个回答
无趣
  • 1.5k
✓ 已被采纳

大致意思就是,你可以用mongoose添加和设置虚拟属性,但是这虚拟属性的值不会保存到数据库中。
比如,前台传到后台一个参数name,代表用户的名称,但是数据库保存的是两个字段,姓和名,这就可以用虚拟属性

// 数据库中缓存的格式
var schema = new Schema({
    name: {
        first: { 'type': String },  
        last: { 'type': String },
      }
});

// 当获取该 schema 的fullname属性时,将 schema 中的 name.first 和 name.last 拼接起来返回
var virtual = schema.virtual('fullname');
virtual.get(function () {
  return this.name.first + ' ' + this.name.last;
});
// 当设置该schema的 fullname 属性时,将设置的字以空格分开,分别赋值给 schema 中的 name.first 和 name.last 属性
var virtual = schema.virtual('fullname');
virtual.set(function (v) {
  var parts = v.split(' ');
  this.name.first = parts[0];
  this.name.last = parts[1];
});

// 将该 schema 保存到数据库中时,只会保存 name.first 和 name.last
// fullname属性的值不会保存到数据库中,这就是virtual

http://mongoosejs.com/docs/ap...

set 中的 function 的参数 v,是设置虚拟属性时的值.不保存到数据库中,但是它也是有存在的意义的,比如,就像例子中的,在用户看来,它只有一个名字,但是在数据库中,是要保存姓和名,因为分为姓和名,我们后续可以对用户做统计,姓张的多少人.(这也只是举个例子).

再比如,订单的状态,数据库中保存的是0,1,2,3,4,5,6,7.但是在页面上,显示的是未支付,已付款,待发货,已发货,待收货,已完成,待评价等.我们就可以设置一个虚拟属性

var virtual = schema.virtual('statusName');
virtual.get(function () {
  switch(this.status){
     case 0: return '待发货';
     case 1: return '待收获';
     case 2: return '已完成';
     default: return '待支付';
  }
  return this.name.first + ' ' + this.name.last;
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏