2012-11-10 4 views
5

Geçici olan mongoose modellerim hakkında bazı bilgilerim var. Performans nedenleriyle onu modele karşı saklamak istemiyorum. Ama bu bilgiyi sunucuma bağlanan ve talep eden müşterilere sağlayabilmek istiyorum. İşte Mongoose anahtar/val ayarı, örneğin JSON veya Console'da gösterilmiyor .. neden?

basit örnek:

var mongoose = require('mongoose'), 
    db = require('./dbconn').dbconn; 

var PersonSchema = new mongoose.Schema({ 
    name : String, 
    age  : Number, 
}); 

var Person = db.model('Person', PersonSchema); 
var fred = new Person({ name: 'fred', age: 100 }); 

Kişi şema iki ı saklamak istediğiniz özellikleri (adı ve yaşı) .. Bu .. çalışır ve biz Konsolda görebileceğiniz vardır:

console.log(fred); 

{name: 'fred', yaş: 100, _ID: 509edc9d8aafee8672000001}

Ben ancak do hızlı bir şekilde değişen ve bunu veritabanında saklamak istemediğim bir öznitelik ("durum") var .. ama bunu dinamik olarak izlemek ve istemcilere sunmak istiyorum, böylece bir anahtar/değer çifti olarak örneğe ekliyorum. Biz "canlı" anahtar/val çiftini ekledikten sonra tekrar konsolda fredbakarsak

fred.status = "alive"; 

yine fred görüyorum ama onun durumu isnt gösterilen:

{isim: 'fred', yaş: 100, _ID: 509edc9d8aafee8672000001}

Oysa val/anahtar çifti olduğunu kesinlikle orada .. görüyoruz:

console.log(fred.status); 

vermektedir:

hayatta

aynı ben "durum" isnt dahil .. müşterilerine yolluyorum nesnenin JSON temsilinin doğrudur ..

Neden olduğunu anlamıyorum .. kimsenin yardımcı olabilir mi? Veya alternatif olarak, veritabanına kalıcı olmayan fongoz şemalarına öznitelik eklemek için daha iyi bir yaklaşım var mıdır?

+0

. Ben her zaman user.avatar'ı kendi gravatar url'sine ekliyorum. – chovy

cevap

9

şemanızı aşağıdakileri ekleme istediğini yapmalıdır:

PersonSchema.virtual('status').get(function() { 
    return this._status; 
}); 

PersonSchema.virtual('status').set(function(status) { 
    return this._status = status; 
}); 

PersonSchema.set('toObject', { 
    getters: true 
}); 

Bu sanal niteliğini status ekler - bir sanal olduğu için bu kalıcı olmayacaktır. Konsol bölümünüzü doğru şekilde yapmak için son kısım gereklidir. Gönderen docs:

tüm virtuals {getters: true} için toObject seçeneğini ayarlamak, sizin console.log çıktı olarak görünmesini için

Ayrıca bir iç özelliği kullanmak gerekir unutmayın status'dan başka ad (burada _status kullandım). Aynı adı kullanırsanız, bir get'i çalıştırırken sonsuz bir yineleme döngüsüne girersiniz.

+0

Güzel .. çok teşekkürler! Mükemmel bir muamele yapar. –

+0

Meraklı .., istemciye gönderilen JSON'da gösterilmeyene kadar Console..s içinde görünür .. –

+1

Verilerinizi göndermeden önce örneğinizde 'toObject' öğesini çağırabilirsiniz. Burada görüldüğü gibi "toJSON" u geçersiz kılmayı tercih ediyorum (https://groups.google.com/d/topic/mongoose-orm/SHe_Fsso_44/discussion). –

1

Veri nesnesinde .toObject() numaralı telefonu arayın.

gibi size kod olacak İçin: Bu firavunfaresi nesnelerle ilginç bir şey olduğunu düşünüyorum

fred.toObject()