2014-11-13 9 views
5

मैं MongoDB/नोड जानने की कोशिश कर रहा हूँ और मैंने देखा है कि एक स्कीमा में मैं अक्सर कुछ इस तरह देखें:नेवला toObject: {virtuals: सच}

toObject: { virtuals: true } 
toJSON: { virtuals: true } 

इन दो पंक्तियों क्या मतलब है?

+0

आप जानते हैं कि यहां सामान्य अभ्यास उन उत्तरों को स्वीकार करने के लिए है जो आपकी मदद करते हैं। उत्तर रेटिंग संख्या के बगल में यह बड़ी "टिक" चीज है। ऐसा कह रहा है क्योंकि आपने उन सभी प्रश्नों का एक जवाब स्वीकार नहीं किया है जिन्हें आपने पूछा है। वे सभी गलत नहीं हो सकते हैं इसलिए उन्हें स्वीकार करें। –

+0

क्या आपने इन विकल्पों पर [प्रलेखन] (http://mongoosejs.com/docs/guide.html#toJSON) पढ़ा है? – JohnnyHK

उत्तर

8

यह "मोंगोडीबी" नहीं है लेकिन मोंगोस ओडीएम के लिए विशिष्ट है।

मोंगोस स्कीमा परिभाषा में "virtual" फ़ील्ड की अवधारणा है। यह अनिवार्य रूप से इस (प्रलेखन से ज़बरदस्त बीनना) की अनुमति:

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

var Person = mongoose.model("Person", personSchema); 

लेकिन लगता है तुम सिर्फ करने के लिए "स्टोर" उन गुणों चाहते हैं, लेकिन फिर कुछ आप "पूरा नाम" कहा जाता है कोड में उपयोग कर सकते हैं की है। यह वह जगह है जहाँ "virtuals" में आते हैं:

personSchema.virtual("name.full").get(function() { 
    return this.name.first + ' ' + this.name.last; 
}); 

अब हम कुछ इस तरह कर सकते हैं:

var bad = new Person({ 
    name: { "first": "Walter", "last": "White" } 
}); 

console.log("%s is insane", bad.name.full); // Walter White is insane 

तो name.full वास्तव में डेटा में मौजूद नहीं है, यह कोड में सिर्फ एक स्कीमा प्रतिनिधित्व है। लेकिन निश्चित रूप से एक ऐसे फ़ंक्शन पर "बंधे" है जो ऑब्जेक्ट में मौजूद वास्तविक डेटा का उपयोग करने के लिए एक विधि है जो विधि में कोड के अनुसार दो फ़ील्ड को जोड़कर मान देता है।

यह मूल रूप से "वर्चुअल" फ़ील्ड के बारे में है। वे वास्तव में "ऑब्जेक्ट" दस्तावेज़ पर परिभाषित "विधियों" हैं जो एक मान प्रस्तुत करते हैं जो "संग्रहीत" नहीं होता है या डेटाबेस में जारी रहता है। आमतौर पर वे डेटा भंडारण से वास्तविक बने मूल्यों पर आधारित होते हैं।

लेकिन वास्तव में अपने प्रत्यक्ष प्रश्न को स्पष्ट करने के लिए। मोंगोस डिफ़ॉल्ट रूप से "संग्रहीत" फ़ील्ड के आधार पर इसकी आंतरिक ऑब्जेक्ट संरचना की सामग्री को 'धारावाहिक' करता है। तो क्या उन दो पंक्तियों "वास्तव में" मतलब हैं:

  1. toObject(): यह अन्य सभी "नेवला जादू" के कुछ हिस्सों के बिना वस्तु डेटा की एक "सादे" या "कच्चे" प्रतिनिधित्व का उत्पादन विस्तारित वस्तु। लेकिन "वर्चुअल" का उद्देश्य उन विधियों को वापस ऑब्जेक्ट का हिस्सा बनाना है। मूल रूप से सिर्फ सादे वस्तु, कहा जाता है के रूप में:

    var model = Model.new({ "name": { "first": "Walter", "last": "White" }); 
    console.log(model.toObject()); 
    
  2. toJSON(): जैसा कि ऊपर दिखाया कि स्पष्टत और सिर्फ इस विधि कॉल कर सकते हैं, लेकिन यह सबसे आम उपयोग नीचे की तरह है, जहां यह है एक JSON पार्सर से है निस्संदेह कहा जाता है। उपरोक्त के रूप में एक ही सिद्धांत लागू होते हैं। "Virtuals" जैसे धारावाहिक उत्पादन में उन तरीकों, के परिणाम शामिल हैं:

    var model = Model.new({ "name": { "first": "Walter", "last": "White" }); 
    JSON.stringify(model, undefined, 2); 
    

तो दूसरे मामले है वस्तु पर .toJSON() विधि का एक "निहित" कॉल। कॉन्फ़िगरेशन क्या कर रहा है, उस विधि को न केवल ऑब्जेक्ट में मौजूद डेटा या "फ़ील्ड्स" को शामिल करने के लिए, बल्कि "वर्चुअल" विधियों को परिभाषित करने और आउटपुट को भी प्रदान करने के तरीके को बता रहा है। .toObject() के लिए वही।

+0

धन्यवाद लेकिन "सेट ('toObject': {virtuals: true})" क्या करता है? मुझे आभासी की अवधारणा मिलती है लेकिन यह मेरे लिए ऐसा लगता है कि आप 'toObject' नामक ऑब्जेक्ट कुंजी सेट कर रहे हैं और इसे किसी ऑब्जेक्ट डेटा वर्चुअल पर सेट कर सकते हैं: सच है, यह यहां प्राप्त करने का प्रयास कर रहा है? – saeho

+0

ऑब्जेक्ट() और toJSON() को समझाने के उत्तर को संपादित करने के लिए धन्यवाद। – saeho

+0

अपरिभाषित करने के लिए – John