2012-11-10 9 views
5

मेरे पास मेरे मोंगोज़ मॉडल पर कुछ जानकारी है जो क्षणिक है। प्रदर्शन कारणों से मैं इसे मॉडल के खिलाफ स्टोर नहीं करना चाहता हूं .. लेकिन मैं यह जानकारी उन ग्राहकों को प्रदान करने में सक्षम होना चाहता हूं जो मेरे सर्वर से जुड़ते हैं और इसके लिए पूछते हैं।उदाहरण पर मोंगोस कुंजी/वैल सेट जेएसओएन या कंसोल में नहीं दिखाया गया .. क्यों?

यहाँ एक सरल उदाहरण है:

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 }); 

व्यक्ति स्कीमा दो विशेषताओं है कि मैं संग्रहीत करना चाहते हैं (नाम और आयु) .. यह काम करता है .. और हम कंसोल में देखना है:

console.log(fred); 

{नाम: 'फ्रेड', उम्र: 100, _ id: 509edc9d8aafee8672000001}

मैं तथापि करना एक विशेषता ("स्थिति") है जो तेजी से बदलती है और मैं इसे डेटाबेस में संग्रहीत नहीं करना चाहता हूं .. लेकिन मैं इसे गतिशील रूप से ट्रैक करना चाहता हूं और इसे ग्राहकों को प्रदान करना चाहता हूं ताकि मैं इसे एक कुंजी/वैल जोड़ी के रूप में उदाहरण में जोड़ूं।

fred.status = "alive"; 

अगर हम पर फ्रेड कंसोल में फिर से "जीवित" कुंजी/वैल जोड़ी को जोड़ने के बाद देखने के लिए हम फिर से fred देखते हैं, लेकिन उनकी स्थिति नहीं है दिखाया गया है:

{नाम: 'फ्रेड', उम्र: 100, _ id: 509edc9d8aafee8672000001}

फिर भी कुंजी/वैल जोड़ी है निश्चित रूप से वहाँ .. हम देखते हैं कि:

console.log(fred.status); 

renders:

जिंदा

एक ही वस्तु है कि मैं ग्राहकों .. "स्थिति" नहीं है शामिल करने के लिए भेज रहा हूं की JSON प्रतिनिधित्व का सच है ..

मुझे समझ में नहीं आता .. क्यों कोई मदद कर सकता है?

या, वैकल्पिक रूप से, डेटाबेस के लिए जारी नहीं होने वाले मोंगोज़ स्कीमा में विशेषताओं को जोड़ने के लिए एक बेहतर तरीका है?

+0

मुझे लगता है कि यह कुछ नेवला वस्तुओं के साथ विचित्र है। मैं हमेशा अपने gravatar यूआरएल होने के लिए user.avatar संलग्न करते हैं। – chovy

उत्तर

9

अपने स्कीमा के लिए निम्नलिखित जोड़ने से आप क्या चाहते हैं करना चाहिए:

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

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

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

इस आभासी विशेषता status कहते हैं - यह कायम नहीं किया जाएगा क्योंकि यह एक आभासी है। आपके कंसोल लॉग आउटपुट को सही तरीके से बनाने के लिए अंतिम भाग की आवश्यकता है। से docs:

सभी virtuals, अपने console.log उत्पादन में दिखाने {ही टिककर खेल: सच} को toObject विकल्प सेट करवाने के लिए

भी ध्यान रखें कि आप एक आंतरिक संपत्ति का उपयोग करने की जरूरत है status के अलावा नाम (यहां मैंने _status का उपयोग किया)। यदि आप एक ही नाम का उपयोग करते हैं, तो आप एक निष्पादन निष्पादित करते समय एक अनंत रिकर्सिव लूप दर्ज करेंगे।

+0

अच्छा .. बहुत धन्यवाद! एक इलाज, सही काम करता है। –

+0

उत्सुक .. कंसोल में दिखाया गया है .. जब तक कि JSON में क्लाइंट को नहीं भेजा गया है .. –

+1

डेटा भेजने से पहले आप अपने उदाहरण पर 'toObject' को कॉल कर सकते हैं। मैं 'toJSON' को ओवरराइड करना पसंद करता हूं [यहां] (https://groups.google.com/d/topic/mongoose-orm/SHe_Fsso_44/discussion)। –

1

डेटा ऑब्जेक्ट पर बस .toObject() पर कॉल करें।

की तरह आप कोड हो जाएगा के लिए:

fred.toObject()