दो प्रकार की वस्तुएं एक-दूसरे के इतनी नज़दीकी लगती हैं कि दोनों को अनावश्यक लगता है। दोनों स्कीमा और मॉडल रखने का क्या मतलब है?मोंगोस के पास स्कीमा और मॉडल दोनों क्यों हैं?
उत्तर
अक्सर इस प्रकार के प्रश्न का उत्तर देने का सबसे आसान तरीका उदाहरण के साथ है। इस मामले में, कोई पहले से ही मेरे लिए यह किया है :)
यहाँ एक नज़र डालें:
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.tasks
DocumentArray
उम्मीद कर रही है। जब आप मॉडल उदाहरणों को सहेजते हैं तो इस तरह आपके एम्बेडेड दस्तावेज़ों में ObjectIds
होगा।
पूरा कोड उदाहरण available as a gist है। उम्मीद है कि मोंगोज़ विकसित होने के चलते ये कार्य-आसपास चिकनी चीजों की मदद करते हैं। मैं अभी भी मोंगोस और मोंगोडीबी के लिए काफी नया हूं इसलिए कृपया टिप्पणियों में बेहतर समाधान और सुझाव साझा करने के लिए स्वतंत्र महसूस करें। हैप्पी डेटा मॉडलिंग!
स्कीमा एक ऐसी वस्तु है जो आपके मोंगोडीबी संग्रह में संग्रहीत किसी भी दस्तावेज़ की संरचना को परिभाषित करती है; यह आपको अपने सभी डेटा आइटम्स के लिए प्रकार और सत्यापनकर्ता परिभाषित करने में सक्षम बनाता है।
मॉडल एक ऐसा ऑब्जेक्ट है जो आपको एक संग्रहित संग्रह तक आसानी से पहुंच प्रदान करता है, जिससे आप संग्रह से पूछताछ कर सकते हैं और उस संग्रह में सहेजे गए दस्तावेज़ों को सत्यापित करने के लिए स्कीमा का उपयोग कर सकते हैं। यह एक स्कीमा, एक कनेक्शन, और एक संग्रह नाम के संयोजन द्वारा बनाया गया है।
मूलतः वलेरी कार्पोव से phrased, MongoDB Blog
मुझे नहीं लगता कि स्वीकार किए जाते हैं जवाब वास्तव में सवाल है कि उत्पन्न किया गया था का जवाब देता है। उत्तर क्यों नहीं समझाता है मोंगोस ने स्कीमा और मॉडल चर दोनों प्रदान करने के लिए डेवलपर की आवश्यकता होने का निर्णय लिया है। एक फ्रेमवर्क का एक उदाहरण जहां उन्होंने डेटा स्कीमा को परिभाषित करने के लिए डेवलपर की आवश्यकता को समाप्त कर दिया है django - एक डेवलपर मॉडल.py फ़ाइल में अपने मॉडल लिखता है, और स्कीमा को प्रबंधित करने के लिए इसे ढांचे में छोड़ देता है। पहला कारण यह है कि वे ऐसा क्यों करते हैं, उन्होंने डीजेंगो के साथ अपना अनुभव दिया, आसानी से उपयोग किया जाता है। शायद अधिक महत्वपूर्ण रूप से DRY (स्वयं को दोहराना न करें) सिद्धांत - जब आप मॉडल बदलते हैं तो स्कीमा को अपडेट करना याद रखना नहीं है - django आपके लिए यह करेगा! रेल आपके लिए डेटा की स्कीमा भी प्रबंधित करता है - एक डेवलपर स्कीमा को सीधे संपादित नहीं करता है, लेकिन स्कीमा में हेरफेर करने वाले माइग्रेशन को परिभाषित करके इसे बदलता है।
एक कारण मैं समझ सकता था कि मोंगोस स्कीमा को अलग करेगा और मॉडल ऐसे उदाहरण हैं जहां आप दो स्कीमा से मॉडल बनाना चाहते हैं। ऐसा परिदृश्य प्रबंधन के लायक होने की तुलना में अधिक जटिलता पेश कर सकता है - यदि आपके पास एक मॉडल द्वारा प्रबंधित दो स्कीमा हैं, तो वे एक स्कीमा क्यों नहीं हैं?
शायद मूल प्रश्न पारंपरिक संबंधपरक डेटाबेस सिस्टम का एक अवशेष है। विश्व नोएसक्यूएल/मोंगो दुनिया में, शायद स्कीमा MySQL/PostgreSQL से थोड़ा अधिक लचीला है, और इस प्रकार स्कीमा बदलना अधिक आम अभ्यास है।
सरल शब्दों में,
एक मॉडल, एक डेटा ऑब्जेक्ट मॉडल है की तरह आप एक MVC डिजाइन pattern.It में मिल जाएगा परिभाषित करता है संरचना डेटा की किस तरह एक डेटाबेस और क्या में संग्रहीत किया जाना है डेटा के संबंध में संबंध है।
एक स्कीमा एक database schema
की तरह है, क्या एक डेटाबेस में संग्रहीत किया जाएगा की परिभाषा।
- 1. मोंगोस स्कीमा
- 2. मोंगोस, मॉडल
- 3. मोंगोस स्कीमा सुरक्षित क्षेत्र
- 4. मोंगोस: सुझाए गए डेटाबेस स्कीमा
- 5. मोंगोडीबी, मोंगोस और नोड.जे.एस. मॉडल क्यों घोषित करें?
- 6. मोंगोस - विभिन्न संग्रहों के लिए समान स्कीमा (मोंगोडीबी)
- 7. मोंगोस स्कीमा/क्वेरी सर्वोत्तम प्रथाओं (मोंगोडीबी, नोड.जेएस)
- 8. मोंगोस में परस्पर निर्भर स्कीमा कैसे बनाएं?
- 9. हमारे पास दोनों जंजीर सरणी और बहुआयामी सरणी क्यों है?
- 10. एकाधिक मोंगोस स्कीमा गुणों को मान्य करना?
- 11. मोंगोस
- 12. मोंगोस स्कीमा ऑब्जेक्ट से फॉर्म पीढ़ी?
- 13. मोंगोस
- 14. मोंगोस और नोडजेएस परियोजना का फ़ाइल संरचना
- 15. मोंगोस
- 16. मोंगोस
- 17. SqlCommand कन्स्ट्रक्टर में SqlConnection और SqlTransaction दोनों क्यों मौजूद हैं?
- 18. मोंगोस खाली ऐरे क्यों जोड़ता है?
- 19. डीओएम में खिड़की और स्वयं दोनों क्यों हैं?
- 20. मॉडल और नियंत्रक दोनों केकेएफपी सत्यापन
- 21. मोंगोस मॉडल से मूल चालक को कर्सर
- 22. छोटे और बड़े एंडियन दोनों उपयोग में क्यों हैं?
- 23. JVM में 'invokespecial' और 'invokestatic' opcodes दोनों क्यों हैं?
- 24. पीएचपी बूलियन दोनों निचले मामले और ऊपरी मामले क्यों हैं?
- 25. जावा में कैकर्ट और जेएससीकेकर्ट दोनों फाइलें क्यों हैं?
- 26. योजना में दोनों सूची और उद्धरण क्यों हैं?
- 27. जेडीके में Math.random() और रैंडम क्लास दोनों क्यों हैं?
- 28. मुक्केबाजी और अनबॉक्सिंग, "System.Object" दोनों आउटपुट क्यों नहीं हैं?
- 29. क्या मेरे पास एक ही चीज के लिए नियंत्रक और एपीकंट्रोलर दोनों हो सकते हैं?
- 30. नोड और मोंगोस
आमतौर पर अनुशंसा की जाती है कि एसओ में पोस्ट किए गए सवालों के जवाब के रूप में नंगे लिंक सबमिट न करें क्योंकि लिंक काम करना बंद कर सकता है (जैसा कि इस मामले में है)। कम से कम प्रतिलिपि/अतीत और उन लेखों के प्रासंगिक अनुभागों को उद्धृत करें जिन्हें आप लिंक करते हैं। – Behrang
किया गया - यह अभी भी Google कैश में था, इसलिए अपेक्षाकृत सरल –
रिकॉर्ड के लिए, एम्बेडेड दस्तावेज़ विधि समस्या ठीक कर दी गई है: https://github.com/LearnBoost/mongoose/issues/249#ref-commit-e18077a – Dakota