鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)/ mongoose 的Virtual是什么?

mongoose 的Virtual是什么?

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

這句話看不是很懂。請(qǐng)不要翻譯,希望能用自己的話解釋,有例子更好。謝謝

回答
編輯回答
筱饞貓

大致意思就是,你可以用mongoose添加和設(shè)置虛擬屬性,但是這虛擬屬性的值不會(huì)保存到數(shù)據(jù)庫(kù)中。
比如,前臺(tái)傳到后臺(tái)一個(gè)參數(shù)name,代表用戶的名稱,但是數(shù)據(jù)庫(kù)保存的是兩個(gè)字段,姓和名,這就可以用虛擬屬性

// 數(shù)據(jù)庫(kù)中緩存的格式
var schema = new Schema({
    name: {
        first: { 'type': String },  
        last: { 'type': String },
      }
});

// 當(dāng)獲取該 schema 的fullname屬性時(shí),將 schema 中的 name.first 和 name.last 拼接起來(lái)返回
var virtual = schema.virtual('fullname');
virtual.get(function () {
  return this.name.first + ' ' + this.name.last;
});
// 當(dāng)設(shè)置該schema的 fullname 屬性時(shí),將設(shè)置的字以空格分開,分別賦值給 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 保存到數(shù)據(jù)庫(kù)中時(shí),只會(huì)保存 name.first 和 name.last
// fullname屬性的值不會(huì)保存到數(shù)據(jù)庫(kù)中,這就是virtual

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

set 中的 function 的參數(shù) v,是設(shè)置虛擬屬性時(shí)的值.不保存到數(shù)據(jù)庫(kù)中,但是它也是有存在的意義的,比如,就像例子中的,在用戶看來(lái),它只有一個(gè)名字,但是在數(shù)據(jù)庫(kù)中,是要保存姓和名,因?yàn)榉譃樾蘸兔?我們后續(xù)可以對(duì)用戶做統(tǒng)計(jì),姓張的多少人.(這也只是舉個(gè)例子).

再比如,訂單的狀態(tài),數(shù)據(jù)庫(kù)中保存的是0,1,2,3,4,5,6,7.但是在頁(yè)面上,顯示的是未支付,已付款,待發(fā)貨,已發(fā)貨,待收貨,已完成,待評(píng)價(jià)等.我們就可以設(shè)置一個(gè)虛擬屬性

var virtual = schema.virtual('statusName');
virtual.get(function () {
  switch(this.status){
     case 0: return '待發(fā)貨';
     case 1: return '待收獲';
     case 2: return '已完成';
     default: return '待支付';
  }
  return this.name.first + ' ' + this.name.last;
});
2018年2月7日 04:42