2012-02-03 17 views

उत्तर

43

अक्सर इस प्रकार के प्रश्न का उत्तर देने का सबसे आसान तरीका उदाहरण के साथ है। इस मामले में, कोई पहले से ही मेरे लिए यह किया है :)

यहाँ एक नज़र डालें:

http://rawberg.com/blog/nodejs/mongoose-orm-nested-models/

संपादित करें: मूल पोस्ट (टिप्पणी में उल्लेख किया) लगता है अब मौजूद नहीं हैं करने के लिए , इसलिए मैं इसे नीचे पुन: पेश कर रहा हूं। क्या यह कभी वापस आना चाहिए, या अगर यह अभी स्थानांतरित हो गया है, तो कृपया मुझे बताएं।

यह नेवला में मॉडल के भीतर स्कीमा का उपयोग करने और कारण है कि आप यह करने के लिए चाहते हो जाएगा की एक सभ्य विवरण देता है, और यह भी मॉडल के माध्यम से कार्य पुश करने के लिए कैसे, जबकि स्कीमा सभी संरचना आदि

के बारे में है आपको पता चलता है मूल पोस्ट:

चलो मॉडल के अंदर एक स्कीमा एम्बेड करने के एक साधारण उदाहरण से शुरू करते हैं।

var TaskSchema = new Schema({ 
    name: String, 
    priority: Number 
}); 

TaskSchema.virtual('nameandpriority') 
    .get(function() { 
     return this.name + '(' + this.priority + ')'; 
    }); 

TaskSchema.method('isHighPriority', function() { 
    if(this.priority === 1) { 
     return true; 
    } else { 
     return false; 
    } 
}); 

var ListSchema = new Schema({ 
    name: String, 
    tasks: [TaskSchema] 
}); 

mongoose.model('List', ListSchema); 

var List = mongoose.model('List'); 

var sampleList = new List({name:'Sample List'}); 

मैं बुनियादी जानकारी एक काम हो सकता है के साथ एक नया TaskSchema वस्तु बनाया। एक मोंगोस virtual attribute कार्य के नाम और प्राथमिकता को आसानी से संयोजित करने के लिए सेटअप है। मैंने केवल एक गेटर निर्दिष्ट किया है लेकिन वर्चुअल सेटर्स भी समर्थित हैं।

मैंने इस सेटअप के साथ विधियों के साथ काम करने के तरीके को प्रदर्शित करने के लिए isHighPriority नामक एक साधारण कार्य विधि भी परिभाषित की है।

ListSchema परिभाषा में आप देखेंगे कि कार्य कुंजी को TaskSchema ऑब्जेक्ट्स की सरणी रखने के लिए कॉन्फ़िगर किया गया है। कार्य कुंजी DocumentArray का उदाहरण बन जाएगी जो एम्बेडेड मोंगो दस्तावेज़ों से निपटने के लिए विशेष तरीकों को प्रदान करती है।

अभी के लिए मैंने केवल ListSchema ऑब्जेक्ट को mongoose.model में पास कर दिया है और टास्कशेमा को छोड़ दिया है। तकनीकी रूप से TaskSchema को औपचारिक मॉडल में बदलने की आवश्यकता नहीं है क्योंकि हम इसे अपने संग्रह में सहेज नहीं पाएंगे। बाद में मैं आपको दिखाऊंगा कि यदि आप ऐसा करते हैं तो यह कुछ भी नुकसान नहीं पहुंचाता है और यह आपके सभी मॉडलों को उसी तरह व्यवस्थित करने में मदद कर सकता है, खासकर जब वे एकाधिक फ़ाइलों को फैलाना शुरू करते हैं।

List मॉडल सेटअप के साथ चलो इसमें कुछ कार्य जोड़ें और उन्हें मोंगो में सहेजें।

var List = mongoose.model('List'); 
var sampleList = new List({name:'Sample List'}); 

sampleList.tasks.push(
    {name:'task one', priority:1}, 
    {name:'task two', priority:5} 
); 

sampleList.save(function(err) { 
    if (err) { 
     console.log('error adding new list'); 
     console.log(err); 
    } else { 
     console.log('new list successfully saved'); 
    } 
}); 

कार्यों हमारे List मॉडल (simpleList) एक नियमित रूप से JavaScript श्रृंखला की तरह काम करता के कहने पर विशेषता और हम धक्का का उपयोग करके उसमें नए कार्य जोड़ सकते हैं। ध्यान देने योग्य महत्वपूर्ण बात यह है कि कार्य नियमित जावास्क्रिप्ट ऑब्जेक्ट्स के रूप में जोड़े जाते हैं। यह एक सूक्ष्म भेद है जो तुरंत सहज नहीं हो सकता है।

आप मोंगो खोल से सत्यापित कर सकते हैं कि नई सूची और कार्य मोंगो में सहेजे गए थे।

db.lists.find() 
{ "tasks" : [ 
    { 
     "_id" : ObjectId("4dd1cbeed77909f507000002"), 
     "priority" : 1, 
     "name" : "task one" 
    }, 
    { 
     "_id" : ObjectId("4dd1cbeed77909f507000003"), 
     "priority" : 5, 
     "name" : "task two" 
    } 
], "_id" : ObjectId("4dd1cbeed77909f507000001"), "name" : "Sample List" } 

अब हम Sample List ऊपर खींचने और उसके कार्यों के माध्यम से पुनरावृति करने के लिए ObjectId उपयोग कर सकते हैं।

List.findById('4dd1cbeed77909f507000001', function(err, list) { 
    console.log(list.name + ' retrieved'); 
    list.tasks.forEach(function(task, index, array) { 
     console.log(task.name); 
     console.log(task.nameandpriority); 
     console.log(task.isHighPriority()); 
    }); 
}); 

आप कोड की है कि पिछले बिट चलाते हैं तो आप कह एम्बेडेड दस्तावेज़ एक विधि isHighPriority नहीं है एक त्रुटि मिल जाएगा। Mongoose के वर्तमान संस्करण में आप सीधे एम्बेडेड स्कीमा पर विधियों तक नहीं पहुंच सकते हैं। इसे ठीक करने के लिए open ticket है और मोंगोस Google समूह को प्रश्न प्रस्तुत करने के बाद, manimal45 ने अब के लिए उपयोग करने के लिए एक सहायक काम पोस्ट किया है।

List.findById('4dd1cbeed77909f507000001', function(err, list) { 
    console.log(list.name + ' retrieved'); 
    list.tasks.forEach(function(task, index, array) { 
     console.log(task.name); 
     console.log(task.nameandpriority); 
     console.log(task._schema.methods.isHighPriority.apply(task)); 
    }); 
}); 

आपको लगता है कि कोड आप कमांड लाइन पर निम्नलिखित उत्पादन देखना चाहिए चलाते हैं।

Sample List retrieved 
task one 
task one (1) 
true 
task two 
task two (5) 
false 
ध्यान में रखते काम के आसपास के एक नेवला मॉडल में TaskSchema गौर करें कि

mongoose.model('Task', TaskSchema); 

var Task = mongoose.model('Task'); 

var ListSchema = new Schema({ 
    name: String, 
    tasks: [Task.schema] 
}); 

mongoose.model('List', ListSchema); 

var List = mongoose.model('List'); 

TaskSchema परिभाषा ही के रूप में तो इससे पहले कि मैं इसे बाहर छोड़ दिया है। एक बार यह मॉडल में बदल जाने के बाद भी हम डॉट नोटेशन का उपयोग करके इसके अंतर्निहित स्कीमा ऑब्जेक्ट तक पहुंच सकते हैं।

चलो एक नई सूची बनाएं और इसके भीतर दो कार्य मॉडल उदाहरण एम्बेड करें।

var demoList = new List({name:'Demo List'}); 

var taskThree = new Task({name:'task three', priority:10}); 
var taskFour = new Task({name:'task four', priority:11}); 

demoList.tasks.push(taskThree.toObject(), taskFour.toObject()); 

demoList.save(function(err) { 
    if (err) { 
     console.log('error adding new list'); 
     console.log(err); 
    } else { 
     console.log('new list successfully saved'); 
    } 
}); 

हम सूची में टास्क मॉडल उदाहरणों को एम्बेड कर रहे हैं जैसा कि हम सादा जावास्क्रिप्ट में अपने डेटा कन्वर्ट करने के लिए उन पर toObject कॉल कर रहे हैं वस्तुओं है कि List.tasksDocumentArray उम्मीद कर रही है। जब आप मॉडल उदाहरणों को सहेजते हैं तो इस तरह आपके एम्बेडेड दस्तावेज़ों में ObjectIds होगा।

पूरा कोड उदाहरण available as a gist है। उम्मीद है कि मोंगोज़ विकसित होने के चलते ये कार्य-आसपास चिकनी चीजों की मदद करते हैं। मैं अभी भी मोंगोस और मोंगोडीबी के लिए काफी नया हूं इसलिए कृपया टिप्पणियों में बेहतर समाधान और सुझाव साझा करने के लिए स्वतंत्र महसूस करें। हैप्पी डेटा मॉडलिंग!

+1

आमतौर पर अनुशंसा की जाती है कि एसओ में पोस्ट किए गए सवालों के जवाब के रूप में नंगे लिंक सबमिट न करें क्योंकि लिंक काम करना बंद कर सकता है (जैसा कि इस मामले में है)। कम से कम प्रतिलिपि/अतीत और उन लेखों के प्रासंगिक अनुभागों को उद्धृत करें जिन्हें आप लिंक करते हैं। – Behrang

+0

किया गया - यह अभी भी Google कैश में था, इसलिए अपेक्षाकृत सरल –

+1

रिकॉर्ड के लिए, एम्बेडेड दस्तावेज़ विधि समस्या ठीक कर दी गई है: https://github.com/LearnBoost/mongoose/issues/249#ref-commit-e18077a – Dakota

31

स्कीमा एक ऐसी वस्तु है जो आपके मोंगोडीबी संग्रह में संग्रहीत किसी भी दस्तावेज़ की संरचना को परिभाषित करती है; यह आपको अपने सभी डेटा आइटम्स के लिए प्रकार और सत्यापनकर्ता परिभाषित करने में सक्षम बनाता है।

मॉडल एक ऐसा ऑब्जेक्ट है जो आपको एक संग्रहित संग्रह तक आसानी से पहुंच प्रदान करता है, जिससे आप संग्रह से पूछताछ कर सकते हैं और उस संग्रह में सहेजे गए दस्तावेज़ों को सत्यापित करने के लिए स्कीमा का उपयोग कर सकते हैं। यह एक स्कीमा, एक कनेक्शन, और एक संग्रह नाम के संयोजन द्वारा बनाया गया है।

मूलतः वलेरी कार्पोव से phrased, MongoDB Blog

2

मुझे नहीं लगता कि स्वीकार किए जाते हैं जवाब वास्तव में सवाल है कि उत्पन्न किया गया था का जवाब देता है। उत्तर क्यों नहीं समझाता है मोंगोस ने स्कीमा और मॉडल चर दोनों प्रदान करने के लिए डेवलपर की आवश्यकता होने का निर्णय लिया है। एक फ्रेमवर्क का एक उदाहरण जहां उन्होंने डेटा स्कीमा को परिभाषित करने के लिए डेवलपर की आवश्यकता को समाप्त कर दिया है django - एक डेवलपर मॉडल.py फ़ाइल में अपने मॉडल लिखता है, और स्कीमा को प्रबंधित करने के लिए इसे ढांचे में छोड़ देता है। पहला कारण यह है कि वे ऐसा क्यों करते हैं, उन्होंने डीजेंगो के साथ अपना अनुभव दिया, आसानी से उपयोग किया जाता है। शायद अधिक महत्वपूर्ण रूप से DRY (स्वयं को दोहराना न करें) सिद्धांत - जब आप मॉडल बदलते हैं तो स्कीमा को अपडेट करना याद रखना नहीं है - django आपके लिए यह करेगा! रेल आपके लिए डेटा की स्कीमा भी प्रबंधित करता है - एक डेवलपर स्कीमा को सीधे संपादित नहीं करता है, लेकिन स्कीमा में हेरफेर करने वाले माइग्रेशन को परिभाषित करके इसे बदलता है।

एक कारण मैं समझ सकता था कि मोंगोस स्कीमा को अलग करेगा और मॉडल ऐसे उदाहरण हैं जहां आप दो स्कीमा से मॉडल बनाना चाहते हैं। ऐसा परिदृश्य प्रबंधन के लायक होने की तुलना में अधिक जटिलता पेश कर सकता है - यदि आपके पास एक मॉडल द्वारा प्रबंधित दो स्कीमा हैं, तो वे एक स्कीमा क्यों नहीं हैं?

शायद मूल प्रश्न पारंपरिक संबंधपरक डेटाबेस सिस्टम का एक अवशेष है। विश्व नोएसक्यूएल/मोंगो दुनिया में, शायद स्कीमा MySQL/PostgreSQL से थोड़ा अधिक लचीला है, और इस प्रकार स्कीमा बदलना अधिक आम अभ्यास है।

0

सरल शब्दों में,

एक मॉडल, एक डेटा ऑब्जेक्ट मॉडल है की तरह आप एक MVC डिजाइन pattern.It में मिल जाएगा परिभाषित करता है संरचना डेटा की किस तरह एक डेटाबेस और क्या में संग्रहीत किया जाना है डेटा के संबंध में संबंध है।

एक स्कीमा एक database schema की तरह है, क्या एक डेटाबेस में संग्रहीत किया जाएगा की परिभाषा।

संबंधित मुद्दे