2013-08-14 31 views
16

Aşağıdaki belge şema var: ArtıkMoğol şemaya 'sanal' değişkenler ekleniyor mu?

var pageSchema = new Schema({ 
     name: String 
    , desc: String 
    , url: String 
}) 

, benim uygulamada ben de nesnenin içine sayfanın html kaynağına sahip istiyorum ama db saklamak istemiyoruz.

Db belgesine başvuruda bulunan "yerel" geliştirilmiş bir nesne oluşturmalı mıyım?

function Page (docModel, html) { 
    this._docModel = docModel 
    this._html = html 
} 

"Sanal" alan ekleyerek belge modelini doğrudan kullanmanın bir yolu var mı?

+0

Nesneye neden sahip olmak istiyorsunuz, ancak saklamıyor musunuz? –

+0

Kalıcı olma gereği duymadığım için: sunucumu yeniden başlatıp, veritabanından nesneyi yeniden yüklerseniz, bu html'nin de güncellenmesi gerekir (dış işlemden gelir). Saklayabilirim ama boşa harcanırdı. Mongoose'da sanal yöntemler bulunduğundan, sanal değişkenlere de sahip olmak güzel olurdu .. – fusio

+1

Nesne üzerinde 'document.prop = html' gibi bir özelliği [girme] özelliğini ayarlayabilirsiniz. Bu yöntemi veya sanalları, yeniden başlatma olmasa bile, nesneyi db'den yeniden alırsanız, aslında "yerel" verileri almanıza izin vermeyeceğini sanmıyorum. –

cevap

32

Bu mongooseda mükemmel şekilde mümkündür. Onların belgelerinden alınan bu örnek
Kontrol: Yukarıdaki örnekte

var personSchema = new Schema({ 
    name: { 
    first: String, 
    last: String 
    } 
}); 

personSchema.virtual('name.full').get(function() { 
    return this.name.first + ' ' + this.name.last; 
}); 
console.log('%s is insane', bad.name.full); // Walter White is insane 

, mülk bir ayarlayıcı olmazdı.

personSchema.virtual('name.full').get(function() { 
    return this.name.full; 
}).set(function(name) { 
    var split = name.split(' '); 
    this.name.first = split[0]; 
    this.name.last = split[1]; 
}); 

Documentation

+2

Evet, ancak yeni alanlar eklemiyorlar. Mevcut olanları kullanıyorlar. – fusio

+1

Ve sorun nedir? Setçileri de kullanabilirsiniz. – gustavohenke

+0

oh, anladım. demek istediğim, bu 'new.mewfield =' sanal 'set' içinde. – fusio

11

Aslında bu test değil ama fikir kıymetli gözüküyor: Bu sanal için bir ayarlayıcı sahip olmak, bunu

//model 
var pageSchema = new Schema({ 
     name: String 
    , desc: String 
    , url: String 
}) 

pageSchema.virtual('html') 
    .get(function(){ 
    var url = this.url 

    function get(url) { 
     return new (require('httpclient').HttpClient)({ 
     method: 'GET', 
      url: url 
     }).finish().body.read().decodeToString(); 
    } 

    return get(url); 
    }); 


    //controller 
    var page = new Page({ 
    name: "Google" 
    , desc: "Search engine" 
    , url: "http://google.com" 
    }); 

    var html = page.html; 

Temelde bir Sanal nitelik html denilen set hangi url özniteliği için beden ister ve onu döndürür.

Ekspres ve res.send(page) kullanıyorsanız, toJSON için sanal özelliklerin çıktısını etkinleştirdiğinizden emin olun. Sanal bir özellik oluşturmak ve alıcı ve ayarlayıcı kullanımını this.__html

pageSchema.virtual('html').get(function() { 
    return this.__html; 
}).set(function (html) { 
    this.__html = html; 
}); 

olsun diye __ ile başlayan

pageSchema.set('toJSON', { 
    virtuals: true 
}); 
12

Belge özellikleri, db kalıcı olmaz ama bu kesmek biraz Bir uyarı ile: bu işlevsellik belgelenmediği için, __ ile başlayan iç özelliklerin hiçbir listesi yoktur, bu nedenle, olası bir olasılıkla, iç uygulama __html

adında bir varyansı kullanmaya başlayabilir

https://github.com/Automattic/mongoose/issues/2642

İlgili konular